Domanda

Ciao a tutti, sono tornato e in attesa di più del vostro splendore. Ho due tabelle:

  1. newsletter - ogni riga contiene un 'id', 'soggetto', 'corpo' e 'da' intestazioni per una e-mail
  2. newsletter_queue - ogni riga contiene un 'id', 'e-mail' indirizzo, 'data' aggiunto alla coda e il 'newsletterid'

Il mio obiettivo è quello di sviluppare una query MySQL che può tirare quantità x di righe da 'newsletter_queue', poi raggrupparli per la loro 'newsletterid' durante l'utilizzo group_concat (o quello che funziona) di mettere tutti i messaggi di posta elettronica in una stringa di caratteri separati che io analizzare con PHP. La ragione per cui mi piacerebbe averli insieme è perché la libreria mailer sto usando (swiftmailer) accetta un array di messaggi di posta elettronica per le email batch. Inoltre, se possibile, sarebbe molto preciso di unire le due tabelle insieme, evitando così una seconda query.

Ecco quello che ho finora:

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

Il mio problema è che il limite di 125 viene applicato alle righe già concatenati, rendendolo inutilizzabile a causa del fatto che sto cercando di limitare la quantità di messaggi di posta elettronica totale di essere inviato in un momento, non bollettini unici. Se qualcuno mi potesse guidare nella giusta direzione, sarei molto riconoscente. Se si finisce per scrivere l'esempio, che è troppo grande.

È stato utile?

Soluzione

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

Questo vale il limite di query interna, prima dell'esecuzione del gruppo dalla dichiarazione. Non importa che il gruppo dalla dichiarazione è nella query esterna da quando un gruppo da avrà bisogno di una tabella temporanea e ordinare in ogni caso. Se avete bisogno di un qualche tipo di ordinamento del risultato concatenato, si può solo applicare alla query esterna, per esempio mediante l'applicazione di max o min fino ad oggi e l'ordine da essa.

Altri suggerimenti

Questo dovrebbe anche fare quello che vuoi:

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

idea selvaggio, ma funziona?

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

avrei il sospetto che la quantità massima di indirizzi di posta elettronica in un record di essere 125.
Sfortunatamente, la quantità non è esatta 125. Potrebbe essere compreso tra 1 e 125.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top