需要复杂的MySql查询帮助

时间:2011-07-07 14:35:12

标签: mysql sql

我正在尝试查找数据库中可能缺少的数据。我有三个表是其中的一部分。第一个是事件表,第二个是子事件表,第三个是来自子事件的子事件的个人数据。

我想做的是: 对于每个事件,找到与之关联的子事件,如果子事件具有字段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中有多少项。它似乎没有找到零(我知道存在)。

根据Nick的建议,我通过

向该组添加了列
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

Link to Tables

我已经尝试了大约一个小时来使这一个查询正常工作。有没有其他想法?

2 个答案:

答案 0 :(得分:0)

尝试类似:

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

报告错误/返回的错误数据。

答案 1 :(得分:0)

你正试图计算一些东西 - 好吧,因为你的INNER JOIN而不存在。

您需要保留s中没有任何匹配数据的t / c组合。请参阅以下查询以列出在s中没有任何数据的所有t / c id对(由于GROUP BY而唯一)。

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