2009-05-27 118 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