consulta MySQL complicado para fila de boletim
-
06-09-2019 - |
Pergunta
Olá a todos, estou de volta e ansioso para mais de seu brilho. Eu tenho duas tabelas:
- boletins - cada linha contém um 'id', 'assunto', 'body' e 'de' cabeçalhos para um e-mail
- 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.
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.