2016-03-17 5 views
0

я следующий оператор SQL теперь:получить ограниченное количество строк в объединенном столбце

SELECT m . * 
FROM newsletter_mail_list m 
INNER JOIN (
    SELECT n.id 
    FROM newsletter n 
    GROUP BY n.customer_id 
    ORDER BY n.id ASC 
) b ON m.newsletter_id = b.id 
WHERE m.sent_date IS NULL 

Список почты Таблица

+--------+-------+--------+--------+-----+ 
| id | newsletter_id | email | sent_date | 
+--------+-------+--------+--------+-----+ 
| 1 | 8    | abcd | today  | 
| 2 | 8    | cfdf | NULL  | 
| 3 | 8    | afdg | NULL  | 
| 4 | 9    | zfbh | NULL  | 
| 5 | 9    | eerg | NULL  | 
| 6 | 9    | ertg | NULL  | 
| 7 | 9    | zfbh | NULL  | 
| 8 | 9    | eerg | NULL  | 
| 9 | 9    | ertg | NULL  | 
| 10 | 9    | zfbh | NULL  | 
| 11 | 9    | eerg | NULL  | 
| 12 | 9    | ertg | NULL  | 
| 13 | 9    | zfbh | NULL  | 
| 14 | 9    | eerg | NULL  | 
| 15 | 9    | ertg | NULL  | 
| 16 | 9    | zfbh | NULL  | 
| 17 | 9    | eerg | NULL  | 
| 18 | 9    | ertg | NULL  | 
+--------+-------+--------+--------+-----+ 

Желаемая Result

+--------+-------+--------+--------+-----+ 
| id | newsletter_id | email | sent_date | 
+--------+-------+--------+--------+-----+ 
| 2 | 8    | cfdf | NULL  | 
| 3 | 8    | afdg | NULL  | 
| 4 | 9    | zfbh | NULL  | 
| 5 | 9    | eerg | NULL  | 
| 6 | 9    | ertg | NULL  | 
| 7 | 9    | zfbh | NULL  | 
| 8 | 9    | eerg | NULL  | 
| 9 | 9    | ertg | NULL  | 
| 10 | 9    | zfbh | NULL  | 
| 11 | 9    | eerg | NULL  | 
| 12 | 9    | ertg | NULL  | 
| 13 | 9    | zfbh | NULL  | 
+--------+-------+--------+--------+-----+ 

Это один дает мне все строки mail_list, где sent_date является NULL, а зарубежный информационный бюллетень является самым старым из клиентов.

Теперь я хочу, чтобы максимально 10 строк списка mail_list были возвращены ДЛЯ КАЖДОГО бюллетеня, возвращаемого подзапросом.

Пример:

В настоящее время я получаю 21 результаты этого SQL, 3 mail_lists, которые принадлежат к получению новостей 8 и 18 результатов для бюллетеня 9. Но количество результатов на рассылку 9 должен быть только 10.

Как я могу сделать это с помощью SQL? Возможно ли это?

+0

Это здорово видеть, что у Вас есть что-то, но еще лучше ... рассмотрите следующий простой двухэтапный курс действий: 1. Если вы еще этого не сделали, укажите надлежащие DDL (и/или sqlfiddle), чтобы мы могли легче реплицировать проблему. 2. Если вы еще этого не сделали, укажите желаемый набор результатов, который соответствует информации, представленной на шаге 1. – Strawberry

+1

Спасибо @ Струберри, я отредактировал мой вопрос – KhorneHoly

ответ

1

Например:

SELECT x.* 
    FROM mail_list x 
    JOIN mail_list y 
    ON y.newsletter_id = x.newsletter_id 
    AND y.id <= x.id 
WHERE x.sent_date IS NULL 
GROUP 
    BY newsletter_id 
    , id 
HAVING COUNT(*) <= 10; 

Если производительность является проблемой, то решение с переменными будет быстрее ...

Например:

SELECT id 
    , newsletter_id 
    , email 
    FROM 
    (SELECT x.* 
      , CASE WHEN @prev=newsletter_id 
        THEN @i:[email protected]+1 
        ELSE @i:=1 END i 
      , @prev:=newsletter_id prev 
     FROM mail_list x 
      , (SELECT @prev:='',@i:=0) vars 
     WHERE sent_date IS NULL 
     ORDER 
      BY newsletter_id, id 
    ) a 
WHERE i <= 10; 
+0

Отлично, это сработало отлично! Не могли бы вы объяснить попытку с переменными? – KhorneHoly

+0

@KhorneHoly, что объясняется в двойной ссылке, которую я вам дал – Shadow

+0

@ Shadow, спасибо, я посмотрю. – KhorneHoly

Смежные вопросы