mysql - 使用 LEFT JOIN 对相同的行进行分类,而无需重复一对多关系

标签 mysql join one-to-many group-concat

请原谅我的问题标题,我不知道应该写什么,我有如下两个表格。

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),否则显示信息。

<小时/>

SQLFiddle Demo

关于mysql - 使用 LEFT JOIN 对相同的行进行分类,而无需重复一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11814581/

相关文章:

mysql - 如何将层次信息存储到数据库中?

mysql - JOIN 子查询与另一个表

sql - 从 24 小时前存在的表中查找用户

java - Spring data JPA - 从一个实体参数中排除 ID 列

python - 从 Python 中执行不同 where 子句的 SQL

linux - Mysql无法通过socket连接到本地服务器

python - 为什么我会收到此错误:Not allparameters wereused in the SQL statements using python?

mysql - 使用 Eloquent laravel 检索所有数据

symfony - 我的左连接在 Symfony 4 中不起作用

java - JPA - OneToMany, ManyToOne, OneToOne 问题