2009-05-27 129 views
1

嘿大家好,我回来了,期待更多的光彩。我有两个表:复杂的MySQL查询通讯队列

  1. 通讯 - 每一行都包含“从”头一个“身份证”,“主题”,“体” &为电子邮件
  2. newsletter_queue - 每一行包含一个“身份证”,'电子邮件”地址,‘日期’添加到队列和‘newsletterid’

我的目标是建立一个MySQL查询,可以从拉x行量‘newsletter_queue’,然后他们按自己的‘newsletterid’,而使用GROUP_CONCAT(或其他任何工作)将所有电子邮件转换为字符分隔的字符串,我将使用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被应用到已经连接在一起行,使之无用,由于这样的事实,我试图限制数量一次发送的电子邮件总数,而不是唯一的时事通讯。如果任何人都能指引我走向正确的方向,我会非常感激。如果你写下这个例子,那也很棒。

+0

有没有什么好的理由来连接SQL中的邮件?特别是因为无论如何都需要使用PHP后处理。从数据库中提取非结构化的字符串是次优的,恕我直言。 – Tomalak 2009-05-27 06:50:05

+0

@Tomalak,好吧,它使我无需重复while()循环来将他们的电子邮件添加到数组中。现在它的设置方式,while()循环只为每个独特的时事通讯循环一次,我使用explode()将电子邮件转换为数组,并使用batchSend()函数一次发送它们,而不是比为每个电子邮件地址打开一个smtp连接。你会推荐另一种方法吗? – bloudermilk 2009-05-27 23:06:13

回答

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将会需要一个临时表并进行排序。如果您需要连接结果的某种排序,则可以将其应用于外部查询,例如,通过应用最大值或最小值来按日期排序。

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之间

+0

>>或任何mod在mysql中: MOD(N,M); N%M; N MOD M – 2009-05-27 06:32:42

2

这也应该做你想要什么:

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