Сложный запрос MySQL для очереди новостной рассылки
Привет всем, я вернулся и с нетерпением жду большего вашего блеска. У меня есть две таблицы:
- информационные бюллетени - каждая строка содержит заголовки 'id', 'subject', 'body' & 'from' для электронного письма
- newsletter_queue - каждая строка содержит "id", "адрес электронной почты", "date", добавленные в очередь, и "newsletterid"
Моя цель состоит в том, чтобы разработать запрос MySQL, который может извлечь x количество строк из "newsletter_queue", а затем сгруппировать их по их "newsletterid", используя GROUP_CONCAT (или что-то еще работающее), чтобы поместить все электронные письма в строку, разделенную символами, которую я буду анализировать с PHP. Причина, по которой я хотел бы собрать их вместе, заключается в том, что используемая мной библиотека почтовой программы (swiftmailer) принимает массив с электронными письмами для пакетных электронных писем. Также, если возможно, было бы очень аккуратно соединить две таблицы вместе, избегая тем самым второго запроса.
Вот что у меня так далеко:
SELECT GROUP_CONCAT(email ORDER BY date ASC SEPARATOR '|'), newsletterid, date
FROM newsletter_queue
WHERE status='0'
GROUP BY newsletterid
LIMIT 125
Моя проблема в том, что LIMIT 125 применяется к уже объединенным строкам, что делает его бесполезным из-за того, что я пытаюсь ограничить общее количество писем, отправляемых за раз, а не уникальных информационных бюллетеней. Если бы кто-нибудь мог направить меня в правильном направлении, я был бы очень признателен. Если вы закончите писать пример, это тоже здорово.
3 ответа
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
Это применяет ограничение к внутреннему запросу до выполнения оператора group by. Неважно, что оператор group by находится во внешнем запросе, так как group by понадобится временная таблица и все равно будет сортироваться. Если вам нужен какой-то порядок упорядочения связанного результата, вы можете просто применить его к внешнему запросу, например, применяя max или min к дате и порядку по нему.
Это также должно делать то, что вы хотите:
SELECT substring_index(GROUP_CONCAT(email ORDER BY date ASC SEPARATOR '|'),'|',125), newsletterid, date
FROM newsletter_queue
WHERE status='0'
GROUP BY newsletterid
Дикая идея, но работает ли это?
SELECT GROUP_CONCAT(email ORDER BY date ASC SEPARATOR '|'), newsletterid, date
FROM newsletter_queue
WHERE status='0'
GROUP BY newsletterid, ID MOD 125
Я подозреваю, что максимальное количество адресов электронной почты в одной записи составляет 125.
К сожалению, сумма не точна 125. Это может быть между 1 и 125.