Question

Salut tout le monde, je suis de retour et attendons avec impatience plus de votre éclat. J'ai deux tables:

  1. bulletins - chaque ligne contient un « id », « sujet », « corps » et « de » têtes pour un e-mail
  2. newsletter_queue - chaque ligne contient un 'id', l'adresse 'e-mail', 'date' ajouté à la file d'attente et le 'newsletterid'

Mon but est de développer une requête MySQL qui peut tirer une quantité x de lignes de « newsletter_queue », puis de les regrouper par leur « newsletterid » tout en utilisant GROUP_CONCAT (ou tout ce qui fonctionne) pour mettre tous les e-mails dans une chaîne séparée de caractères Je vais analyser avec PHP. La raison pour laquelle je voudrais les avoir ensemble est parce que la bibliothèque de mailer J'utilise (swiftmailer) accepte un tableau avec des e-mails pour des e-mails par lots. De plus, si possible, il serait très propre à joindre les deux tables ensemble, évitant ainsi une deuxième requête.

Voici ce que j'ai à ce jour:

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

Mon problème est que la limite de 125 est appliquée aux lignes déjà chaînés, rendant inutile en raison du fait que je suis en train de limiter la quantité d'e-mails envoyés au total à un moment, pas les bulletins uniques. Si quelqu'un pouvait me guider dans la bonne direction, je serais très reconnaissant. Si vous liquidez écrit l'exemple, c'est super aussi.

Était-ce utile?

La solution

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

Cela vaut la limite à la requête interne, avant que le groupe par instruction est exécutée. Peu importe que le groupe par déclaration est dans la requête externe depuis un groupe en aura besoin d'une table temporaire et trier de toute façon. Si vous avez besoin d'une sorte de commande du résultat chaînés, il vous suffit de l'appliquer à la requête externe, par exemple en appliquant max ou min à ce jour et de l'ordre par elle.

Autres conseils

Cela devrait aussi faire ce que vous voulez:

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

idée sauvage, mais cela fonctionne?

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

Je suppose que le montant maximum de dans adresses e-mail un enregistrement pour être 125.
Malheureusement, le montant est pas exacte 125. Il pourrait se situer entre 1 et 125.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top