1

大家好,我回来了,期待你们的更多精彩。我有两张桌子:

  1. 时事通讯——每行包含一个电子邮件的“id”、“主题”、“正文”和“发件人”标题
  2. newsletter_queue — 每行包含一个“id”、“email”地址、添加到队列中的“date”和“newsletterid”

我的目标是开发一个 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 被应用于已经连接的行,由于我试图限制一次发送的电子邮件总数,而不是唯一的时事通讯,因此它变得无用。如果有人能引导我朝着正确的方向前进,我将不胜感激。如果你最终写了这个例子,那也很好。

4

3 回答 3

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

This applies the limit to the inner query, before the group by statement is executed. It doesn't matter that the group by statement is in the outer query since a group by will need a temporary table and sort anyway. If you need some kind of ordering of the concatenated result, you can just apply it to the outer query, for instance by applying max or min to date and order by it.

于 2009-05-27T06:20:23.733 回答
2

This should also do what you want:

SELECT substring_index(GROUP_CONCAT(email ORDER BY date ASC SEPARATOR '|'),'|',125), newsletterid, date
FROM newsletter_queue
WHERE status='0'
GROUP BY newsletterid
于 2010-09-10T20:01:20.123 回答
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 之间。

于 2009-05-27T06:15:17.800 回答