Pergunta

Olá a todos, estou de volta e ansioso para mais de seu brilho. Eu tenho duas tabelas:

  1. boletins - cada linha contém um 'id', 'assunto', 'body' e 'de' cabeçalhos para um e-mail
  2. newsletter_queue - cada linha contém um 'id', 'email' endereço, 'date' adicionado a fila eo 'newsletterid'

Meu objetivo é desenvolver uma consulta MySQL que pode puxar x quantidade de linhas de 'newsletter_queue', em seguida, agrupá-los por sua 'newsletterid' ao usar GROUP_CONCAT (ou o que funciona) para colocar todos os e-mails em um personagem string separada que vou analisar com PHP. A razão que eu gostaria de tê-los juntos é porque a biblioteca mailer Eu estou usando (SwiftMailer) aceita uma matriz com e-mails para e-mails em lote. Além disso, se possível, seria muito elegante para unir as duas tabelas em conjunto, evitando assim uma segunda consulta.

Aqui está o que eu tenho até agora:

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

O meu problema é que o limite de 125 está sendo aplicada às linhas já concatenadas, tornando-o inútil devido ao fato de que eu estou tentando limitar a quantidade de e-mails totais sendo enviados de cada vez, não boletins únicas. Se alguém pudesse me guiar na direção certa, eu ficaria muito grato. Se você acaba de escrever o exemplo, isso é ótimo também.

Foi útil?

Solução

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

Isto aplica-se o limite para a consulta interna, antes de o grupo por instrução é executada. Não importa que o grupo pela declaração é na consulta externa desde que um grupo por precisará de uma tabela temporária e tipo de qualquer maneira. Se você precisar de algum tipo de ordenação do resultado concatenado, você pode simplesmente aplicá-lo à consulta externa, por exemplo através da aplicação de máximo ou mínimo para data e ordem por ela.

Outras dicas

Isso também deve fazer o que quiser:

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

idéia selvagem, mas isso funciona?

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

Eu suspeito que a quantidade máxima de endereços de e-mail em um registro para ser 125.
Infelizmente, a quantidade não é exacto 125. Pode situar-se entre 1 e 125.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top