到目前为止,我有以下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 |
+--------+-------+--------+--------+-----+
期望结果
+--------+-------+--------+--------+-----+
| 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,而国外的通讯是来自客户的最早的。
现在,我只希望每个由子subselect返回的时事通讯返回最大10行mail_list。
示例:
到目前为止,我通过这个SQL获得了21个结果,其中3个mail_lists属于时事通讯8,18个结果属于时事通讯9,但是新闻稿9的结果数量应该只有10个。
我怎么能用SQL来完成这个任务呢?这有可能吗?
发布于 2016-03-17 14:41:56
例如:
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:=@i+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;
https://stackoverflow.com/questions/36063168
复制相似问题