这对您来说应该很容易,但是我在这里迷路了:
我有一个包含4个表的数据库:订单,客户,产品,orders_products
我需要获取所有带有所有订单的客户,包括没有订单的客户。
我只得到一次下订单的机会。 “客户”表中较旧的“尼克”不会显示。
我在这里做错了什么?
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是我的问题。
再次感谢您的光临。
答案 0 :(得分:1)
使用显式联接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
答案 1 :(得分:1)
我建议您使用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;
答案 2 :(得分:0)
从不在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;