gpt4 book ai didi

mysql - 子选择动态行数作为单个查询中的列

转载 作者:行者123 更新时间:2023-11-29 06:47:49 24 4
gpt4 key购买 nike

大家好,我有以下 3 个表:

      person                    event                       attendance
| id | name | age | | id | name | added | | id | pId | eId | attended |
|-----------------| |---------------------------| |---------------------------|
| 5 | bob | 20 | | 0 | wedding | 01.01.2013 | | 0 | 5 | 0 | YES |
| 6 | ryan | 25 | | 1 | party | 01.01.2013 | | 1 | 5 | 1 | NO |

所以“person”和“attendance”是动态增长的,而“event”是一个保存事件名称的静态表。我正在努力实现以下结果:

| id | name | age | wedding | party |
|-----------------------------------|
| 0 | bob | 20 | YES | NO |
| 1 | ryan | 25 | NO | NO |

我应该提一下我的实时数据库非常大(我有大约 11 个静态事件名称,所以这个例子最终会有 14 列)并且中间还有另一个表(模拟标志)所以性能非常重要.我想知道这是否可以通过一个查询来实现,以及如何准确地实现它?

最佳答案

SELECT p.id, p.name, p.age, 
MAX(IF(e.name='wedding', a.attended, NULL)) AS `wedding`,
MAX(IF(e.name='party', a.attended, NULL)) AS `party`
FROM person p
JOIN attendance a ON a.pId = p.id
JOIN event e ON a.eId = e.id
GROUP BY p.id;

在编写此查询之前,您需要事件名称列表。


关于您的评论,我明白您的意思,没有 ryan 参加任何事件的行,因此该人不会出现在结果中。 JOIN 仅返回具有一个或多个匹配出勤行的人员行。

解决这个问题的方法是使用 LEFT OUTER JOIN。无论是否存在匹配的行,都会返回人员行。

SELECT p.id, p.name, p.age,
COALESCE(MAX(IF(e.name='wedding', a.attended, NULL)), 'NO')AS `wedding`,
COALESCE(MAX(IF(e.name='party', a.attended, NULL)), 'NO') AS `party`
FROM person p
LEFT OUTER JOIN attendance a ON a.pId = p.id
LEFT OUTER JOIN event e ON a.eId = e.id
GROUP BY p.id;

+----+------+------+---------+-------+
| id | name | age | wedding | party |
+----+------+------+---------+-------+
| 5 | bob | 20 | YES | NO |
| 6 | ryan | 25 | NO | NO |
+----+------+------+---------+-------+

PS:示例结果中的 id 列不应该有值 5 和 6 吗?

关于mysql - 子选择动态行数作为单个查询中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17579910/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com