Сложный запрос MySQL для очереди информационных бюллетеней

StackOverflow https://stackoverflow.com/questions/914190

Вопрос

Привет всем, я вернулся и с нетерпением жду новых проявлений вашего мастерства.У меня есть две таблицы:

  1. информационные бюллетени — каждая строка содержит заголовки «id», «тема», «тело» и «от» для электронного письма.
  2. newsletter_queue — каждая строка содержит идентификатор, адрес электронной почты, дату добавления в очередь и идентификатор информационного бюллетеня.

Моя цель - разработать запрос 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 применяется к уже объединенным строкам, что делает его бесполезным из-за того, что я пытаюсь ограничить общее количество писем, отправляемых за один раз, а не уникальных информационных бюллетеней.Если бы кто-нибудь мог направить меня в правильном направлении, я был бы очень признателен.Если вы в конечном итоге напишете пример, это тоже здорово.

Это было полезно?

Решение

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 в любом случае потребуется временная таблица и сортировка.Если вам нужно какое-то упорядочение объединенного результата, вы можете просто применить его к внешнему запросу, например, применив максимум или минимум к дате и упорядочив по нему.

Другие советы

Это также должно делать то, что вы хотите:

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top