【发布时间】:2020-12-17 16:30:24
【问题描述】:
(在将其标记为重复之前,请阅读问题)。
我有两个不同的表,Bot 和 Switch。
Bot
ID | Info | Active
------------------
0 | abc | 1
1 | def | 1
Switch
Date | Activated | BotID | User
-------------------------------------
2020-01-01 | 1 | 0 | John
2020-01-02 | 0 | 0 | John
对于每个机器人,我想检索其最新状态,这意味着:对于每个机器人,我想知道最新行的Activated 字段是1 还是0。为了为那些在Switch 表中没有条目的机器人返回结果,我尝试使用LEFT JOIN 语句。这是查询:
SELECT IFNULL(x.Activated, 0) AS Following, b.ID, b.Info
FROM bot b
LEFT JOIN (
SELECT *
FROM switch s1
WHERE s1.Date IN (
SELECT MAX(s.Date)
FROM switch s
WHERE s.User = 'SomeUsername'
GROUP BY s.Bot
)
) AS x ON x.BotID = b.ID
WHERE b.Active = 1
我的预期结果是:
Following | ID | Info
---------------------
0 | 0 | abc
0 | 1 | def
重点是我没有得到所有行,而是这个查询只返回一行:
Following | ID | Info
---------------------
0 | 0 | abc
这很奇怪,因为我使用的是LEFT JOIN。为了弄明白怎么回事,我分别跑了
SELECT *
FROM bot
和
SELECT *
FROM switch s1
WHERE s1.Date IN (
SELECT MAX(s.Date)
FROM switch s
WHERE s.User = 'SomeUsername'
GROUP BY s.Bot
)
当然,第一个查询返回:
ID | Info
---------
0 | abc
1 | def
当第二个返回时:
Date | Activated | BotID | User
-------------------------------------
2020-01-02 | 0 | 0 | John
我真的不明白为什么LEFT JOIN 没有同时保留Bot 行。我检查了this 问题,但我没有使用任何外部WHERE 所以这不是我的情况。
提前致谢!
【问题讨论】:
-
b.Active不在您显示的架构中 -
@GarrGodfrey 抱歉,我试图尽可能简化架构。刚刚编辑了问题。谢谢你告诉我。
-
你的查询应该做你想做的事。你能设置一个db<>fiddle 来演示这个问题吗?
-
这里有问题。您声称此连接有效
AS x ON x.Bot = b.ID但 x 不包含列Bot根据您的“而第二个返回”输出 -
旁注;如果您使用的是 MariaDB,请先声明您使用的是它,而不是 MySQL。两个产品不一样
标签: sql mariadb left-join greatest-n-per-group mariadb-10.1