gpt4 book ai didi

mysql - LEFT JOIN 查询返回多个结果

转载 作者:可可西里 更新时间:2023-11-01 08:35:20 24 4
gpt4 key购买 nike

我有下面的查询,它查看一个数据表,其中每一行都有一个 ID、日期/时间和关键操作(以及其他数据)。此表无法更改,也不在我的控制范围内。

查询发现 Create 操作(始终是第一个)的出现,提取 ID 和创建日期/时间,然后提取其他关键操作(添加信息、预约、接受)的日期/时间一行数据:

SELECT _create.ID AS ID, 
_create.`datetime` AS Create,
_inform.`datetime` AS Add_Info,
_bookap.`datetime` AS Book_Appt,
_accept.`datetime` AS Accept,
FROM table AS _create
LEFT JOIN table AS _inform ON (_create.ID = _inform.ID AND _inform.action = 'Add Info')
LEFT JOIN table AS _bookap ON (_create.ID = _bookap.ID AND _bookap.action = 'Book Appt')
LEFT JOIN table AS _accept ON (_create.ID = _accept.ID AND _accept.action = 'Accept')
WHERE _create.action="Create"

所以我得到类似的东西:

ID  -  Create Date - Inform Date - Bookap Date - Accept Date
1234 01/02/2013 02/02/2013 09/02/2013 10/02/2013

这很好用。

但是,如果查询发现 2 个相同类型的事件,即同一 ID 的“Book Appt”(有时可能会发生),它会为该 ID 提取两行数据。所以我得到:

ID  -  Create Date - Inform Date - Bookap Date - Accept Date
1234 01/02/2013 02/02/2013 09/02/2013 10/02/2013
1234 01/02/2013 02/02/2013 15/02/2013 10/02/2013

我需要它忽略第二次出现并且每个 ID 只返回一行。或者,甚至更好地返回显示 Bookap Date1 和 Bookap Date2 的行。

有什么想法吗?

最佳答案

使用GROUP BY 将记录分组为一行,min()选择最早的事件日期。

SELECT _create.ID AS ID, 
min(_create.`datetime`) AS Create,
min(_inform.`datetime`) AS Add_Info,
min(_bookap.`datetime`) AS Book_Appt,
min(_accept.`datetime`) AS Accept,
FROM table AS _create
LEFT JOIN table AS _inform ON (_create.ID = _inform.ID AND _inform.action = 'Add Info')
LEFT JOIN table AS _bookap ON (_create.ID = _bookap.ID AND _bookap.action = 'Book Appt')
LEFT JOIN table AS _accept ON (_create.ID = _accept.ID AND _accept.action = 'Accept')
WHERE _create.action="Create"
GROUP BY _create.ID;

显示所有事件日期但仍返回一行的快速而肮脏的方法是使用 group_concat()函数而不是 min()在上面的查询中。这会将多个 datetime 放入单个列中,然后您的应用程序层需要对其进行解析。

关于mysql - LEFT JOIN 查询返回多个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14610264/

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