我有客户 客户可以有 N 个交付 每个交付可以有 N 个短信
Delivery 有 client_id Sms 作为 Delivery_id
我想从短信表中检索所有短信,但每个客户最多 10 条短信。
这是因为“短信”是要发送的短信队列。所以我想最初以这种简单的方式保持平衡,从每个客户端发送的短信的分布。
有没有办法只使用 SQL 来完成这个?
如果我加入客户发送到短信...如何为每个客户只选择十个短信?
我正在将 MYSQL 与 InnoDb 一起使用
这在mysql中并不容易做到。这个 SO question 有一些可能有用的答案:
特别是,文章http://www.explodybits.com/2011/11/mysql-row-number/应该会有所帮助。
如果它对其他人有帮助,对于 SQL Server(2005 或更高版本),可以这样做:
WITH
ClientSms AS
(
SELECT
Client.Client_id,
Sms.Content,
ROW_NUMBER() OVER
(
PARTITION BY Client.Client_id
ORDER BY Sms.Content
) AS RowNumber
FROM Client
INNER JOIN Delivery ON Delivery.Client_id = Client.Client_id
INNER JOIN Sms ON Sms.Delivery_id = Delivery.Delivery_id
)
SELECT
Client.Client_id,
Sms.Content
FROM ClientSms
WHERE RowNumber <= 10
ORDER BY
Client.Client_id,
Sms.Content
编辑:我再次尝试,这次使用 MySQL 并使用 Fiddle 进行测试。代码很脏,我认为你可以在没有一些 SELECT 的情况下做到这一点,但这是我想出的伪造行数的方法。希望它是有帮助的。
SELECT *
FROM (
SELECT
(SELECT COUNT(*)
FROM (
SELECT s.smsid, c.clientid
FROM sms s INNER JOIN delivery d ON d.deliveryid = s.deliveryid
INNER JOIN client c ON c.clientid = d.clientid
) AS numberedSMS
WHERE numberedSMS.smsid <= numberedSMS2.smsid
AND
numberedSMS.clientid = numberedSMS2.clientid) AS rowNum,
smsid AS smsid
FROM (
SELECT smsid, c.clientid
FROM sms s INNER JOIN delivery d ON d.deliveryid = s.deliveryid
INNER JOIN client c ON c.clientid = d.clientid
) numberedSMS2
ORDER BY numberedSMS2.smsid asc
) as r
WHERE r.ROWNUM <= 10
这里有SQLFiddle 代码