将2个表连接在一起时遇到问题,如下所示
Table 'jobs'
id int(20) auto_increment PK
name varchar(200)
Table 'logs'
id int(20) auto_increment PK
job_id int(20) FK(events.id)
event varchar(200)
我希望所有unique ID's
都有logs.event = 'initialized'
和logs.event = 'failed'
的日志条目
我如何使用MySQL做到这一点?
我已经尝试过这个查询,但它不起作用(查询成功,0结果,而结果在数据库中匹配)
SELECT
a.id,
a.name
FROM
jobs as a
RIGHT OUTER JOIN logs b ON b.job_id = a.id
WHERE
b.event = 'initialized'
AND
b.event = 'failed'
答案 0 :(得分:3)
试试这个:
SELECT
a.id,
a.name
FROM jobs a
INNER JOIN logs b on b.jobid = a.id
WHERE
b.event = 'initialized'
AND a.id in (SELECT distinct jobid from logs WHERE event = 'failed')
答案 1 :(得分:1)
试试这个
SELECT DISTINCT
a.id, a.name
FROM jobs as a
INNER JOIN logs b ON b.job_id = a.id
INNER JOIN logs c ON c.job_id = a.id
WHERE
b.event = 'initialized'
AND
c.event = 'failed'
基本上我假设任何单个日志不能同时“初始化”和“失败” - 所以你必须连接两次并测试两个单独的日志条目......?
修改:根据评论中的建议进行更新。
答案 2 :(得分:1)
我不会尝试为您提供解决方案,因为我认为您的查询没有任何问题,如果您说数据库中有匹配的行,则应该给出结果。
但是有几点:
您确定要让所有作业ID都具有“初始化”和“失败”事件的日志条目吗?也许您正在查找具有“已初始化”或“失败”事件的日志条目的所有作业ID。如果后者是您所需要的,请尝试在WHERE子句中使用OR
而不是AND
。
根据您的表格结构logs
。job_id
是events
。id
的FK。但在您的查询中,您正在logs
。job_id
和jobs
。id
之间进行联接。你的FK是不正确还是logs
。job_id
不是工作ID而是事件ID?
另一方面,你为什么要使用RIGHT OUTER JOIN? INNER JOIN不能用于检索相同的结果吗?
答案 3 :(得分:1)
假设您要检查两个事件,您应该使用LOGS(每个事件一个连接)内部连接JOBS表两次。我使用内连接是因为你想要发生两个事件。
SELECT
a.id,
a.name
FROM
jobs as a
INNER JOIN logs b ON b.job_id = a.id
INNER JOIN logs c ON c.job_id = a.id
WHERE
b.event = 'initialized'
AND
c.event = 'failed'
答案 4 :(得分:0)
SELECT
a.id,
a.name
FROM
jobs a
INNER JOIN logs b ON b.job_id = a.id AND b.event = 'initialized' AND b.event = 'failed'
GROUP BY a.id