请原谅我的问题标题,我不知道应该写什么,我有如下两个表格。
products orders
+------+----------+ +--------+------+-------+
| id | name | | id | qty | pid |
+------+----------+ +--------+------+-------+
| 1 | mouse | | 10001 | 20 | 1 |
| 2 | keyboard | | 10002 | 15 | 3 |
| 3 | headset | | 10004 | 5 | 3 |
+------+----------+ | 10005 | 12 | 2 |
| 10006 | 18 | 1 |
+--------+------+-------+
这是我正在使用的 LEFT JOIN 查询和输出
SELECT p.id AS No, p.name AS ProductName, o.qty AS Quantity
FROM products AS p
LEFT JOIN orders AS o ON p.id = o.pid
+------+-------------+----------+
| No | ProductName | Quantity |
+------+-------------+----------+
| 1 | mouse | 20 |
| 1 | mouse | 18 |
| 2 | keyboard | 12 |
| 3 | headset | 15 |
| 3 | headset | 5 |
+------+-------------+----------+
我想要实现的输出如下:
+------+-------------+----------+
| No | ProductName | Quantity |
+------+-------------+----------+
| 1 | mouse | 20 |
| | | 18 |
| 2 | keyboard | 12 |
| 3 | headset | 15 |
| | | 5 |
+------+-------------+----------+
我的问题是可以这样做吗?非常感谢任何回复和建议。谢谢。
P/S:我也尝试过使用 GROUP_CONCAT(qty SEPARATOR ",") 但它在一行中返回结果,因为我将来可能会在 Orders 表中添加更多附加列,这将很困难阅读。
最佳答案
当然,这是可能的——而且不需要使用变量:
SELECT IF(c.min_oid IS NOT NULL, a.id, NULL) AS No,
IF(c.min_oid IS NOT NULL, a.name, NULL) AS ProductName,
b.qty AS Quantity
FROM products a
JOIN orders b ON a.id = b.pid
LEFT JOIN (
SELECT MIN(id) AS min_oid
FROM orders
GROUP BY pid
) c ON b.id = c.min_oid
ORDER BY a.id,
b.id
基本上,它的作用是,如果该行不是特定产品的最小订单 ID,则显示空白(NULL),否则显示信息。
<小时/>关于mysql - 使用 LEFT JOIN 对相同的行进行分类,而无需重复一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11814581/