嘿伙计我有mysql查询的问题。我正在发送新闻通讯。
我的mysql架构看起来像是http://sqlfiddle.com/#!2/178b7/18
我怎么想从数据库中获取将要发送的邮件的COUNT。
对于LISTS中的每个List_ID,从lists_mailbases中获取每个base_id,然后计算email_database中的所有base_id。
例如,在我的架构中,list1应该有4个收件人,列表2应该有2个收件人。
我写了这样的话:
SELECT l.id, COUNT(*) FROM lists l
JOIN lists_mailbases lm ON l.id = lm.list_id
JOIN email_database ed ON ed.base_id = lm.base_id
GROUP BY l.id;
但结果我的结果差不多两倍了。 (在sqlfiddle上它没关系,但在我的主数据库中,我有很多记录,它给了我错误的数据)
答案 0 :(得分:1)
SQLFiddle的好问题!
只需将ed.base_id添加到GROUP BY
即可 SELECT l.id,ed.base_id, COUNT(*) , GROUP_CONCAT(ed.email)
FROM lists l JOIN lists_mailbases lm ON l.id = lm.list_id
JOIN email_database ed ON ed.base_id = lm.base_id
GROUP BY l.id,ed.base_id;
顺便提一下,您的lists_mailbases
重复数据,它有2行,具有相同的base_id。
如果您的数据正确且想要计算DISTINCT base_id,请执行COUNT(DISTINCT base_id)
如下所示
SELECT l.id, COUNT(DISTINCT ed.base_id) , GROUP_CONCAT(ed.email)
FROM lists l JOIN lists_mailbases lm ON l.id = lm.list_id
JOIN email_database ed ON ed.base_id = lm.base_id
GROUP BY l.id;
答案 1 :(得分:1)
正如你所说,你得到的数量是预期的两倍,看起来其中一个连接会产生多个连接记录。诊断出来。
SELECT ID, COUNT(*)
FROM
(
SELECT l.id, ED.BASE_ID FROM lists l
JOIN lists_mailbases lm ON l.id = lm.list_id
JOIN email_database ed ON ed.base_id = lm.base_id
GROUP BY l.id, ED.BASE_ID
) A;