Bülten kuyrukta için karmaşık MySQL sorgusu

3 Cevap php

Hey herkes, ben geri döndüm ve parlaklık daha fazla arıyoruz. İki tablo var:

  1. bültenler - her satır bir 'id', 'konu', 'beden' & içeriyor Bir e-posta için 'dan başlıkları
  2. newsletter_queue - her satır bir 'id', 'e-posta adresi,' tarih 'kuyruk eklenmiş ve' newsletterid 'içeriyor

Amacım ayrıştırmak edecek bir karakter ayrılmış bir dizeye tüm e-posta koymak GROUP_CONCAT kullanarak (ya da işleri ne olursa olsun) ise onların 'newsletterid tarafından' grup, daha sonra, 'newsletter_queue' onları satır x miktarda indirebiliriz bir MySQL sorgusu geliştirmek PHP ile. I (SwiftMailer) kullanıyorum mailler kütüphane toplu e-postalar için e-posta ile bir dizi kabul çünkü onları bir arada olmasını istiyorum nedenidir. Ayrıca, eğer mümkünse, böylelikle ikinci bir sorgu kaçınarak, birlikte iki tablo katılmak çok düzgün olacaktır.

İşte ben bugüne kadar ne var:

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

Benim sorunum SINIRI 125 dolayı ben bir süre değil, benzersiz bültenler de gönderilen toplam e-postaların miktarını sınırlamak için çalışıyorum ki aslında gereksiz kılan, zaten birleştirilmiş satırlara uygulanan olmasıdır. Herkes bana doğru yönde yol olsaydı, ben çok minnettar olacaktır. Eğer örnek yazmaya kadar rüzgar varsa, bu çok harika.

3 Cevap

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

Deyimi ile grup çalıştırılmadan önce, bu, iç sorgu sınırı geçerlidir. Bu deyimi ile grup sıralama zaten geçici bir tabloya ihtiyacınız olacak ve bir grup beri dış sorguda olduğunu fark etmez. Eğer birleştirilmiş sonucu sipariş çeşit gerekiyorsa, sadece max uygulayarak, örneğin, dış sorguya uygulamak ya da onun tarafından tarih ve sırasına min edebilirsiniz.

Bu da ne istediğinizi yapmanız gerekir:

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

Vahşi bir fikir ama bu işler?

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

I'd suspect the maximum amount of email adresses in one record to be 125.
Unfortunately, the amount is not exact 125. It could be between 1 and 125.