Требуется помощь по сложному запросу MySql - PullRequest
1 голос
/ 07 июля 2011

Я пытаюсь найти данные, которые могут отсутствовать в моей базе данных. У меня есть три таблицы, которые являются частью этого. Первая представляет собой таблицу событий, вторая представляет собой таблицу подэтапов, а третья представляет собой данные отдельных лиц из подэтапа для части подэтапов.

Я бы хотел сделать следующее: Для каждого события найдите связанные с ним под-события, если для под-события задано поле tfile, а затем проигнорируйте его, если оно не просматривает данные отдельных лиц. Если в нем 0 совпадающих записей, выведите их в список.

Вот то, что я думаю, будет работать, но не правильно:

select event.*, subevent.* from event.id
join subevent on event.id = subevent.eid
join pdata on subevent.subid = pdata.subid
where subevent.textfile = ''
and Count(pdata.subid) = 0;

Редактировать: Добавлен код от пользователя, используются реальные имена таблиц:

SELECT tb_event.*, cr_event.* 
FROM tb_event
INNER JOIN cr_event ON tb_event.id = cr_event.eid
INNER JOIN searchable_data ON cr_event.id = searchable_data.race_id
WHERE cr_event.tfile = ''
GROUP BY cr_event.id
HAVING Count(searchable_data.race_id) = 0

Дополнительная информация. Я полагаю, что проблема заключается в количестве элементов в searchable_data. Кажется, он не находит те, которые имеют ноль (я знаю, что они существуют).

в соответствии с предложением Ника я добавил столбцы в группу на

SELECT tb_event.*, cr_event.id 
FROM tb_event
INNER JOIN cr_event ON tb_event.id = cr_event.eid
INNER JOIN searchable_data ON cr_event.id = searchable_data.race_id
WHERE cr_event.tfile = ''
GROUP BY tb_event.id, tb_event.ename, tb_event.ecity, tb_event.eplace, tb_event.elocation, tb_event.zip, tb_event.day, tb_event.year, tb_event.etime, tb_event.logo, tb_event.remail, tb_event.descr, tb_event.link, tb_event.reg, tb_event.rname, tb_event.created_by, cr_event.id
HAVING Count(searchable_data.race_id) = 0

Ссылка на таблицы

Я пытался около часа, чтобы этот запрос работал. У кого-нибудь есть другие идеи?

Ответы [ 2 ]

0 голосов
/ 07 июля 2011

Вы пытаетесь посчитать что-то, что ... ну, не совсем существует из-за вашего ВНУТРЕННЕГО СОЕДИНЕНИЯ.

Вам нужно будет сохранить комбинации t / c, которые не имеют соответствующих данных, вs.См. Запрос ниже, чтобы перечислить все пары идентификаторов t / c (уникальные из-за GROUP BY), у которых нет данных в s.

SELECT t.id, c.id 
FROM tb_event t
INNER JOIN cr_event c ON t.id = c.eid
LEFT OUTER JOIN searchable_data s ON c.id = s.race_id

WHERE c.tfile = ''
AND s.race_id IS NULL -- This is what you need to check for
GROUP BY t.id, c.id
0 голосов
/ 07 июля 2011

Попробуйте что-то вроде:

SELECT tb_event.*, cr_event.id 
FROM tb_event
INNER JOIN cr_event ON tb_event.id = cr_event.eid
INNER JOIN searchable_data ON cr_event.id = searchable_data.race_id
WHERE cr_event.tfile = '' OR cr_event.tfile IS NULL
GROUP BY tb_event.id, tb_event.ename, tb_event.ecity, tb_event.eplace, tb_event.elocation, tb_event.zip, tb_event.day, tb_event.year, tb_event.etime, tb_event.logo, tb_event.remail, tb_event.descr, tb_event.link, tb_event.reg, tb_event.rname, tb_event.created_by, cr_event.id
HAVING Count(searchable_data.race_id) = 0

Сообщить об ошибках / неверных данных, которые он возвращает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...