Pregunta

Hola a todos, estoy de vuelta y con ganas de más de su brillantez. Tengo dos tablas:

  1. boletines - cada fila contiene un 'id', 'sujeto', 'cuerpo' y 'desde' cabeceras de un correo electrónico
  2. newsletter_queue - cada fila contiene un 'id', 'email' dirección, 'fecha' añadido a la cola y
  3. 'newsletterid'

Mi objetivo es el desarrollo de una consulta MySQL, que puede tirar de x cantidad de filas de 'newsletter_queue', entonces agruparlos por su 'newsletterid' durante el uso de GROUP_CONCAT (o lo que funcione) para poner todos los mensajes de correo electrónico en una cadena de caracteres separados los cuales voy a analizar con PHP. La razón por la que me gustaría tenerlos juntos es porque la biblioteca de cliente de correo que estoy usando (SwiftMailer) acepta una matriz con los mensajes de correo electrónico para mensajes de correo electrónico por lotes. También, si es posible, sería muy ordenado para unir las dos tablas juntas, evitando así una segunda consulta.

Esto es lo que tengo hasta ahora:

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

Mi problema es que el límite 125 se aplica a las filas ya concatenados, lo que hace inútil debido al hecho de que yo estoy tratando de limitar la cantidad de correos electrónicos totales de ser enviado a la vez, no boletines únicos. Si alguien me podría guiar en la dirección correcta, estaría muy agradecido. Si uno acaba escribiendo el ejemplo, que es grande también.

¿Fue útil?

Solución

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

Esto se aplica el límite de la consulta interna, antes de ejecutar la instrucción GROUP BY. No importa que el grupo por la declaración está en la consulta externa desde que un grupo por necesitará una tabla temporal y el tipo de todos modos. Si necesita algún tipo de ordenamiento del resultado concatenado, sólo puede aplicarlo a la consulta externa, por ejemplo mediante la aplicación max o min hasta la fecha y el orden por el mismo.

Otros consejos

Esto también debería hacer lo que quiera:

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

Salvaje idea, pero funciona esto?

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

Me sospecho que la cantidad máxima de direcciones de correo electrónico en un solo registro para ser 125.
Por desgracia, la cantidad no es exacta 125. Podría ser entre 1 y 125.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top