mysql 多表查询中需要空字段

7eumitmz  于 2023-01-12  发布在  Mysql
关注(0)|答案(3)|浏览(111)

这对你来说应该很容易,但我在这里迷路了:
我有一个有4个表的数据库:订单,客户,产品,订单_产品
我需要获取所有客户,与他们的所有订单,* 包括 * 那些没有任何订单。
我只得到了那些已经下了订单的客户。客户表中可怜的老“尼克”不会出现。
我到底做错了什么?

SELECT c.name clientname, o.id orderID, GROUP_CONCAT(p.name) productNAMEs,
    GROUP_CONCAT(p.id) productIDs
FROM clients c, orders o, orders_products op, products p
WHERE c.id = o.client_id
AND c.status = 1
AND o.id = op.order_id
AND p.id = op.product_id
GROUP BY c.name

参见此处的表格定义:https://www.db-fiddle.com/f/bTRSLfYTa19S2EpE2zKwUv/7

更新

@scaisedge给出了一个答案,其中包括没有订单的客户:

SELECT c.name clientname, o.id orderID, GROUP_CONCAT(p.name) productNAMEs, 
GROUP_CONCAT(p.id) productIDs
FROM clients c
LEFT JOIN  orders o ON c.id = o.client_id
LEFT  JOIN  orders_products op ON o.id = op.order_id
LEFT  JOIN  products p  ON p.id = op.product_id  
WHERE c.status = 1
GROUP BY c.name

您可以在此处看到结果:https://www.db-fiddle.com/f/8bGcQJSbSFmKMUo1tLuZuA/1
似乎不使用JOIN是我的问题。

mf98qq94

mf98qq941#

使用显式连接sintax和左连接来检索不匹配的行

SELECT c.name clientname, o.id orderID, GROUP_CONCAT(p.name) productNAMEs, 
GROUP_CONCAT(p.id) productIDs
FROM clients c
LEFT JOIN  orders o ON c.id = o.client_id
LEFT  JOIN  orders_products op ON o.id = op.order_id
LEFT  JOIN  products p  ON p.id = op.product_id  
WHERE c.status = 1
GROUP BY c.name
9gm1akwq

9gm1akwq2#

我建议你使用JOIN来统一表中的数据。JOIN子句用于根据两个或多个表之间的相关列来合并这些表中的行。
https://www.w3schools.com/sql/sql_join.asp

SELECT *
FROM clients LEFT JOIN orders ON clients.id = orders.client_id
     LEFT JOIN orders_products ON clients.id = orders_products.order_id 
     LEFT JOIN products ON products.id = orders_products.product_id
WHERE clients.status = 1;
u0sqgete

u0sqgete3#

  • 切勿 * 在FROM子句中使用逗号。* 始终 * 使用正确、明确的标准JOIN语法。

此外,您的GROUP BY需要与SELECT中的未聚合列匹配。
我不知道你是不是有意的

SELECT c.name as clientname, o.id as orderID,        
       GROUP_CONCAT(p.name) as productNAMEs,
       GROUP_CONCAT(p.id) productIDs
FROM clients c left join
     orders o
     on c.id = o.client_id left join
     orders_products op
     on o.id = op.order_id left join
     products p
     on p.id = op.product_id
WHERE c.status = 1
GROUP BY c.name, o.id;

或者:

SELECT c.name as clientname,      
       GROUP_CONCAT(p.name) as productNAMEs,
       GROUP_CONCAT(p.id) productIDs
FROM clients c left join
     orders o
     on c.id = o.client_id left join
     orders_products op
     on o.id = op.order_id left join
     products p
     on p.id = op.product_id
WHERE c.status = 1
GROUP BY c.name;

相关问题