一、leftjoin一对多
1、leftjoin一对多是指一个表的记录对应多个表的记录,这种情况可以用leftjoin只取一条来实现。比如我们有一个订单表和一个商品表,一个订单可以包含多个商品,我们只需要显示每个订单的一条商品记录,可以用以下SQL语句实现:
SELECT o.order_id, g.goods_name, g.goods_price
FROM orders o
LEFT JOIN goods g ON o.order_id = g.order_id
AND g.goods_id =
(SELECT goods_id
FROM goods
WHERE order_id = o.order_id
LIMIT 1)
以上SQL语句中,我们使用了子查询来限制只取每个订单的一条商品记录。首先,我们将订单表和商品表通过LEFT JOIN连接起来,因为一个订单可能没有对应的商品记录。然后,在ON条件中,我们指定了通过订单号(order_id)来连接订单表和商品表,并使用子查询限制只取商品表中每个订单最先出现的商品记录。这样,我们就能得到每个订单的一条商品信息。
2、除了使用子查询,我们还可以使用DISTINCT关键字来限制只取每个订单的一条商品记录。以下是一个使用DISTINCT关键字的例子:
SELECT DISTINCT o.order_id, g.goods_name, g.goods_price
FROM orders o
LEFT JOIN goods g ON o.order_id = g.order_id
以上SQL语句中,我们使用了DISTINCT关键字来限制只取每个订单的一条商品记录。这种方式与子查询方法相比,在代码上更简洁。
二、leftjoinon多条件
1、有时候,我们需要通过多个条件来连接两个表。例如,我们有一个订单表和一个地址表,我们需要通过订单号和地址类型(shipping或billing)来连接这两个表,这时我们可以使用leftjoin只取一条多条件方法。以下是一个使用两个条件连接的例子:
SELECT o.order_id, a.address_line1, a.city, a.state
FROM orders o
LEFT JOIN addresses a ON o.order_id = a.order_id
AND a.address_type = 'shipping'
OR a.address_type = 'billing'
AND a.address_id = (
SELECT address_id
FROM addresses a2
WHERE o.order_id = a2.order_id
AND (a2.address_type = 'shipping' OR a2.address_type = 'billing')
LIMIT 1
)
以上SQL语句中,我们使用了两个条件来连接订单表和地址表。在ON条件中,我们用AND、OR逻辑运算符连接两个条件,连接方式可以自由变换。注意,当使用多个条件时,需要将条件括在一组括号内并嵌套一个子查询,以便限制只取每个订单的一条地址记录。
2、除了使用子查询,我们还可以使用分组(GROUP BY)和聚合函数(MIN或MAX)来限制只取每个订单的一条地址记录。以下是一个使用GROUP BY和MIN函数的例子:
SELECT o.order_id, a.address_line1, a.city, a.state
FROM orders o
LEFT JOIN addresses a ON o.order_id = a.order_id AND a.address_type = 'shipping'
GROUP BY o.order_id
以上SQL语句中,我们使用了GROUP BY关键字和聚合函数MIN来限制只取每个订单的一条地址记录。GROUP BY关键字将订单表和地址表连接起来,而MIN函数将地址表中同一订单号的地址记录合并为一条记录。同时,我们还通过WHERE条件限制了只取地址类型为shipping的记录。
三、leftjoin多对一
1、假设我们有一个订单表和一个客户表,一个客户可以有多个订单,但我们只需要显示每个订单的一个客户记录,这种情况我们也可以使用leftjoin只取一条来实现。以下是一个多对一连接的例子:
SELECT o.order_id, c.customer_name, c.customer_email
FROM orders o
LEFT JOIN customers c ON o.customer_id = c.customer_id
AND c.customer_id = (
SELECT customer_id
FROM customers
WHERE customer_id = o.customer_id
LIMIT 1
)
以上SQL语句中,我们将订单表和客户表通过LEFT JOIN连接起来,以便连接每个订单和一个客户。在ON条件中,我们指定了通过客户号(customer_id)来连接订单表和客户表,并使用子查询限制只取客户表中每个订单首次出现的客户记录。这样,我们就能得到每个订单的一个客户记录。
2、除了使用子查询外,我们还可以使用DISTINCT关键字来限制只取每个订单的一个客户记录。以下是一个使用DISTINCT关键字的例子:
SELECT DISTINCT o.order_id, c.customer_name, c.customer_email
FROM orders o
LEFT JOIN customers c ON o.customer_id = c.customer_id
以上SQL语句与前面使用子查询的方式相比,更加简洁。
四、leftjoin多个on条件选取
1、当我们需要在多个表之间建立连接时,可以使用LEFT JOIN和多个ON条件。以下是一个使用LEFT JOIN连接三张表并使用两个ON条件的例子:
SELECT o.order_id, c.customer_name, p.product_name, p.product_price
FROM orders o
LEFT JOIN customers c ON o.customer_id = c.customer_id AND
o.order_date BETWEEN c.customer_start_date AND c.customer_end_date
LEFT JOIN products p ON o.product_id = p.product_id AND
c.customer_id = p.customer_id
以上SQL语句中,我们链接了订单表、客户表和产品表,并用两个ON条件识别了连接。第一个ON条件将订单表的订单日期与客户表的客户开始和结束日期进行比较,以确定每个订单对应的客户。第二个ON条件将订单表和产品表连接起来,并通过客户号(customer_id)将产品限制在每个客户的产品中。
2、当我们需要在多个表之间建立连接时,还可以使用子查询来指定条件。以下是一个使用子查询连通三张表并指定条件的例子:
SELECT o.order_id, c.customer_name, p.product_name, p.product_price
FROM orders o
LEFT JOIN customers c ON o.customer_id = (
SELECT c2.customer_id
FROM customers c2
WHERE o.order_date BETWEEN c2.customer_start_date AND c2.customer_end_date
LIMIT 1
)
LEFT JOIN products p ON o.product_id = p.product_id AND c.customer_id = p.customer_id
以上SQL语句与前面的例子使用了相同的三张表。在第一个LEFT JOIN中,我们使用了子查询来确定每个订单对应的顾客。此后,我们使用同样的方法将产品记录限制在每个顾客的产品中。