MySQL Eloquent join using “USING” clause with N query
在MySQL中使用联结(join)是一种非常常见的需求,许多开发者在运用MySQL操作数据库的时候需要进行联结。Laravel框架的Eloquent ORM是一个非常强大的MySQL操作工具,而在Eloquent ORM中,使用”USING”子句进行联结是一个常见的操作,本篇文章将针对此操作进行详解。
阅读更多:MySQL 教程
什么是”USING”子句
“USING”子句是一种关键字,用于在MySQL联结(join)中指定共同列。它允许我们使用联结在两个或多个表之间建立共同后缀的列进行匹配。简而言之,“USING”子句是指共同列作为联结条件的一种约定。
下面是使用”USING”子句的语法:
SELECT column_name(s)
FROM table1
JOIN table2
USING (column_name)
当两个表有至少一个列具有相同的名称和数据类型时,”USING” 子句就会发挥作用。 另一方面,如果两个表的列名称有所不同,则必须使用”JOIN ON”语句。
“USING”子句的优点
使用”USING”子句的优点是明显的。当使用Joins连接两个表并为它们的共同列创建共同的名称时,使用”USING”可以更加简单。
除了简化和增强可读性之外,使用”USING”子句还能够:
- 帮助避免列名冲突。
- 更好地执行某些聚合操作。
让我们看看下面的示例。
使用”USING”子句联结两个表
在这个例子中,我们将创建两个表,一个是”users”表,另一个是”orders”表,然后我们将它们联合起来,并使用”USING”子句在它们的共同列”id”上实现联结。
创建表:
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50)
);
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
amount Decimal(12, 2),
FOREIGN KEY (user_id) REFERENCES users(id)
);
向表中插入数据:
INSERT INTO users VALUES(1, 'Jack');
INSERT INTO users VALUES(2, 'Tom');
INSERT INTO users VALUES(3, 'Jerry');
INSERT INTO orders VALUES(1, 1, 100);
INSERT INTO orders VALUES(2, 1, 200);
INSERT INTO orders VALUES(3, 2, 150);
INSERT INTO orders VALUES(4, 3, 300);
现在,我们可以使用以下SQL语句将两个表连接起来:
SELECT *
FROM users
JOIN orders
USING (id)
结果将如下所示:
+----+----------+---------+--------+
| id | username | user_id | amount |
+----+----------+---------+--------+
| 1 | Jack | 1 | 100.00 |
| 1 | Jack | 1 | 200.00 |
| 2 | Tom | 2 | 150.00 |
| 3 | Jerry | 3 | 300.00 |
+----+----------+---------+--------+
“USING”子句连接多个表
使用”USING”子句来连接多个表也是很方便的。在这个例子中,我们将继续在我们的”users”和”orders”表之间进行一个联接,但是我们还将添加一个”customers”表。每个”order”都会涉及到一个”customer”,并且一个”customer”可以有多个订单。
创建表:
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50)
);
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
customer_id INT,
amount Decimal(12, 2),
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (customer_id) REFERENCES customers(id)
);
CREATE TABLE customers (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(50)
);
向表中插入数据:
INSERT INTO users VALUES(1, 'Jack');
INSERT INTO users VALUES(2, 'Tom');
INSERT INTO users VALUES(3, 'Jerry');
INSERT INTO customers VALUES(1, 'John', 'john@example.com');
INSERT INTO customers VALUES(2, 'Mike', 'mike@example.com');
INSERT INTO customers VALUES(3, 'Kelly', 'kelly@example.com');
INSERT INTO orders VALUES(1, 1, 1, 100);
INSERT INTO orders VALUES(2, 1, 2, 200);
INSERT INTO orders VALUES(3, 2, 3, 150);
INSERT INTO orders VALUES(4, 3, 2, 300);
现在,我们将使用以下SQL语句将三个表连接起来:
SELECT *
FROM users
JOIN orders
USING (id)
JOIN customers
USING (customer_id)
结果将如下所示:
+----+----------+---------+-------------+--------+------+------------------+
| id | username | user_id | customer_id | amount | name | email |
+----+----------+---------+-------------+--------+------+------------------+
| 1 | Jack | 1 | 1 | 100.00 | John | john@example.com |
| 1 | Jack | 1 | 2 | 200.00 | Mike | mike@example.com |
| 2 | Tom | 2 | 3 | 150.00 | Kelly| kelly@example.com|
| 3 | Jerry | 3 | 2 | 300.00 | Mike | mike@example.com |
+----+----------+---------+-------------+--------+------+------------------+
Eloquent ORM 中使用”USING”子句
在Eloquent ORM中,使用”USING”子句的方法与MySQL中的方法类似。可以在查询生成器实例中使用此语法,例如:
$users = DB::table('users')
->join('orders', 'users.id', '=', 'orders.user_id')
->join('customers', 'orders.customer_id', '=', 'customers.id')
->select('users.*', 'orders.*', 'customers.*')
->get();
上述示例演示了如何使用”USING”子句连接三个表并选择所有列。
总结
在MySQL联结(join)查询中,使用”USING”子句是一项非常有用的技术。它可以提高代码的可读性,使连接操作更加简单,减少出错的机会,同时也可以更好地执行某些聚合操作。
在Eloquent ORM中,使用”USING”子句也非常容易,开发者们可以轻松地在查询生成器实例中应用此方法。
极客笔记