使用LEFT JOIN分类相同的行而不重复一对多的关系
请原谅我的问题标题,我不知道该怎么说,我有这两个表如下。使用LEFT JOIN分类相同的行而不重复一对多的关系
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表中添加更多的附加列,它将会难以阅读。
在这种情况下,你可以使用MySQL变量。我将以前的产品ID存储在变量@prev
中,并且只有当它更改时,我们才输出产品名称。
http://www.sqlfiddle.com/#!2/d5fd6/9
SET @prev := NULL;
SELECT
IF(@prev = p.id, NULL, p.id) AS No,
IF(@prev = p.id, NULL, p.name) AS ProductName,
o.qty AS Quantity
,@prev := p.id
FROM products AS p
LEFT JOIN orders AS o
ON p.id = o.pid
谢谢,这正是我要找的! – Shukri 2012-08-05 08:15:51
当然,这可能—和无需使用的变量:
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),否则显示信息。
谢谢,你们俩都很棒,现在我有更多的参考指= = – Shukri 2012-08-05 08:17:03
是不是更应该SQL之外来解决可视化的问题吗? – 2012-08-05 07:15:44
@juergend感谢澄清问题,所以,似乎不可能在SQL中做什么,那么如果我试图用php和mysql做一个简单的报告,你会有什么建议吗?你有任何好的引用来分享? – Shukri 2012-08-05 07:30:08