Сложный запрос MySQL для очереди новостной рассылки - PullRequest
1 голос
/ 27 мая 2009

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

  1. новостные рассылки - каждая строка содержит заголовки 'id', 'subject', 'body' & 'from' для письма
  2. newsletter_queue - каждая строка содержит 'id', 'email' адрес, 'date', добавленные в очередь, и 'newsletterid'

Моя цель состоит в том, чтобы разработать запрос MySQL, который может извлечь х количество строк из «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 ]

3 голосов
/ 27 мая 2009
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 к дате и порядку по нему.

2 голосов
/ 11 сентября 2010

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

SELECT substring_index(GROUP_CONCAT(email ORDER BY date ASC SEPARATOR '|'),'|',125), newsletterid, date
FROM newsletter_queue
WHERE status='0'
GROUP BY newsletterid
0 голосов
/ 27 мая 2009

Дикая идея, но это работает?

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.

...