MySQL加入时事通讯

时间:2013-12-17 18:07:17

标签: php mysql sql

嘿伙计我有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上它没关系,但在我的主数据库中,我有很多记录,它给了我错误的数据)

2 个答案:

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