gpt4 book ai didi

具有多种可能性的 MySQL LEFT Join 和 Inner Join

转载 作者:行者123 更新时间:2023-11-29 02:22:03 25 4
gpt4 key购买 nike

我不知道是否有人问过类似的问题,但我在 stackoverflow 的 mysql 上看了一个多小时

我的问题是,我有多个表,我需要在 mysql 中使用左连接和内连接来连接它们

实体表:

id (key) | entityName

1 | john
2 | harris
3 | henry
4 | mark
5 | dom

事件表

id (key) | entityID  | status

1 | 1 | 1
2 | 2 | 0
3 | 4 | 1

地理数据表

id (key) | entityID  | moment (timestamps when the entry was done)

1 | 1 | 1429542320 (smaller)
2 | 1 | 1429542331 (bigger)
3 | 2 | 1429542320 (smaller)
4 | 2 | 1429542331 (biger)
5 | 4 | 1429542331 (bigger)

信息表

id (key) | entityID | infos | date 

1 | 1 | xxx | today
2 | 1 | xxx | yesterday
3 | 2 | xxx | today
4 | 2 | xxx | yesterday
5 | 3 | xxx | yesterday
6 | 5 | xxx | today
7 | 5 | xxx | yesterday
8 | 5 | xxx | tomorrow

所以基本上,我需要每个有今天信息的实体此外,如果他们的状态为真(或 1)(来自事件表),请在地理数据表中显示他们的日期。

这就是我得到的:

SELECT e.id, 
e.entityName,
i.infos,
a.status,
MAX(g.moment) -- but the max only if status =1
FROM entities AS e
LEFT JOIN activity AS a ON a.entityID = e.id
LEFT JOIN geodata AS g ON g.entityID = e.id
INNER JOIN infos AS i ON e.id = i.entityID
WHERE i.date = 'today'
GROUP BY e.id

我希望每个实体都有关于今天的信息,但其中一些实体也有事件,所以我想展示它(如果它不只是让左连接放 NULL)如果状态为 0,我不需要时间,但如果它是真的,我只需要更大的(它的数字,所以 Max() 应该这样做但它坏了)

预期的结果是:

id (key) | entityName | infos |   status |   MAX(moment) | ..other columns

1 | john | xxx | 1 | 1429542331 (the bigger one)
2 | harris | xxx | 0 | NULL
5 | dom | xxx | NULL | NULL

如果有人能帮助我,我将不胜感激:)PS.: 对不起我的英语,它不是我的第一语言

最佳答案

你可以改变 MAX(g.moment)IF(a.status<>1, NULL, MAX(g.moment))

或交替更改 LEFT JOIN geodata AS g ON g.entityID = e.idLEFT JOIN geodata AS g ON a.entityID = e.id AND a.status = 1

哪个更快可能取决于您的实际数据;第二个可能更快,因为连接的记录较少,但它使用的更复杂的连接条件可能会减慢连接速度。

关于具有多种可能性的 MySQL LEFT Join 和 Inner Join,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30107458/

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