Соединение нескольких рядов - PullRequest
1 голос
/ 21 июня 2011

У меня проблема с объединением двух таблиц следующим образом:

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' AND 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 ]

3 голосов
/ 21 июня 2011

Попробуйте это:

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 голос
/ 21 июня 2011

Предполагая, что вы хотите проверить оба события, вы должны дважды объединить таблицу JOBS с LOGS (по одному соединению на событие). Я использую внутреннее соединение, потому что вы хотите, чтобы оба события произошли.

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'
1 голос
/ 21 июня 2011

Я не буду пытаться дать вам решение, потому что я думаю, что в вашем запросе нет ничего плохого, и должен дать результаты, если вы скажете, что в вашей БД есть совпадающие строки.

Но несколько моментов:

  1. Вы уверены, что хотите, чтобы все идентификаторы заданий, имеющие запись в журнале для ОБА инициализированных и сбойных событий?Возможно, вы ищете все идентификаторы заданий, в которых есть запись в журнале для «инициализированных» или «сбойных» событий.Если вам нужен последний вариант, попробуйте использовать OR вместо AND в предложении WHERE.

  2. В соответствии с вашей структурой таблицы logs. job_id - это FKдля events. id.Но в вашем запросе вы делаете соединение между logs. job_id и jobs. id.Ваш FK неверен или logs. job_id не работают идентификаторы, а идентификаторы событий?

С другой стороны, почему вы используете RIGHT OUTER JOIN?INNER JOIN не работает для получения тех же результатов?

1 голос
/ 21 июня 2011

Попробуйте вместо этого

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'

По сути, я предполагаю, что ни один отдельный журнал не может быть одновременно "инициализирован" И "сбой" одновременно - поэтому вам нужно присоединиться дважды и проверить дваотдельные записи журнала ...?

Редактировать: обновлять с предложениями в комментариях.

0 голосов
/ 21 июня 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...