加入多行

时间:2011-06-21 08:37:15

标签: mysql sql

将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'

5 个答案:

答案 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)

我不会尝试为您提供解决方案,因为我认为您的查询没有任何问题,如果您说数据库中有匹配的行,则应该给出结果。

但是有几点:

  1. 您确定要让所有作业ID都具有“初始化”和“失败”事件的日志条目吗?也许您正在查找具有“已初始化”或“失败”事件的日志条目的所有作业ID。如果后者是您所需要的,请尝试在WHERE子句中使用OR而不是AND

  2. 根据您的表格结构logsjob_ideventsid的FK。但在您的查询中,您正在logsjob_idjobsid之间进行联接。你的FK是不正确还是logsjob_id不是工作ID而是事件ID?

  3. 另一方面,你为什么要使用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