通讯队列的复杂MySQL查询

时间:2009-05-27 06:06:04

标签: php mysql newsletter swiftmailer

嘿大家,我回来了,期待更多的光彩。我有两张桌子:

  1. 简报 - 每一行都包含'id','subject','body'和& 'from'标题为电子邮件
  2. newsletter_queue - 每行包含一个'id','email'地址,'date'添加到队列和'newsletterid'
  3. 我的目标是开发一个MySQL查询,可以从'newsletter_queue'中提取x行,然后使用GROUP_CONCAT(或其他任何工作)将它们按'newsletterid'分组,将所有电子邮件放入字符分隔的字符串中我会用PHP解析。我想将它们放在一起的原因是因为我正在使用的邮件程序库(swiftmailer)接受一个包含批量电子邮件的电子邮件的数组。此外,如果可能的话,将两个表连接在一起将非常简洁,从而避免第二次查询。

    这是我到目前为止所拥有的:

    SELECT GROUP_CONCAT(email ORDER BY date ASC SEPARATOR '|'), newsletterid, date
    FROM newsletter_queue
    WHERE status='0'
    GROUP BY newsletterid
    LIMIT 125
    

    我的问题是LIMIT 125正在应用于已连接的行,因为我试图限制一次发送的总电子邮件数量,而不是唯一的新闻简报,因此无法使用它。如果有人能指导我朝着正确的方向前进,我将非常感激。如果你最终写下这个例子,那也很棒。

3 个答案:

答案 0 :(得分:3)

SELECT GROUP_CONCAT(email ORDER BY date ASC SEPARATOR '|'), newsletterid, date
FROM 
   (SELECT email, newsletterid, date 
    FROM newsletter_queue
    WHERE status="0"
    ORDER BY date ASC
    LIMIT 125) as Unsent
GROUP BY newsletterid

这将在执行group by语句之前将限制应用于内部查询。 group by语句在外部查询中并不重要,因为group by无论如何都需要临时表和排序。如果您需要对连接结果进行某种排序,则可以将其应用于外部查询,例如将max或min应用于日期并按顺序排序。

答案 1 :(得分:2)

这也应该做你想要的:

SELECT substring_index(GROUP_CONCAT(email ORDER BY date ASC SEPARATOR '|'),'|',125), newsletterid, date
FROM newsletter_queue
WHERE status='0'
GROUP BY newsletterid

答案 2 :(得分:0)

狂野的想法,但这有效吗?

SELECT GROUP_CONCAT(email ORDER BY date ASC SEPARATOR '|'), newsletterid, date
FROM newsletter_queue
WHERE status='0'
GROUP BY newsletterid, ID MOD 125

我怀疑一条记录中的最大电子邮件数量为125 不幸的是,数量并不精确到125.它可能在1到125之间。