1

みなさん、こんにちは。私は戻ってきて、あなたの輝きをもっと楽しみにしています。私は2つのテーブルを持っています:

  1. ニュースレター—各行には、電子メールの「id」、「subject」、「body」、「from」ヘッダーが含まれています
  2. newsletter_queue —各行には、「id」、「email」アドレス、「date」がキューに追加され、「newsletterid」が含まれます。

私の目標は、「newsletter_queue」からx個の行をプルできるMySQLクエリを開発し、GROUP_CONCAT(または機能するもの)を使用してすべての電子メールを文字区切りの文字列に入れて解析しながら、「newsletterid」でグループ化することです。 PHPで。それらを一緒にしたい理由は、私が使用しているメーラーライブラリ(swiftmailer)が、バッチメール用のメールを含む配列を受け入れるためです。また、可能であれば、2つのテーブルを結合して、2番目のクエリを回避するのが非常に便利です。

これが私がこれまでに持っているものです:

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

これにより、group by ステートメントが実行される前に、内部クエリに制限が適用されます。group by には一時テーブルとソートが必要になるため、group by ステートメントが外側のクエリにあることは問題ではありません。連結された結果の何らかの順序付けが必要な場合は、たとえば max または min を日付に適用し、それによって順序付けするなどして、それを外側のクエリに適用できます。

于 2009-05-27T06:20:23.733 に答える
2

これもあなたが望むことをするはずです:

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

1 つのレコードに含まれる電子メール アドレスの最大数は 125 であると思われます。
残念ながら、この数は正確には 125 ではありません。1 から 125 の間である可能性があります。

于 2009-05-27T06:15:17.800 に答える