我是客户 客户可以有N个交付 每个交付可以有N个短信
交付有client_id 短信作为Delivery_id
我想从Sms表中检索所有短信,但每个客户端最多10个短信。
这是因为'sms'是要发送的短信队列。所以我想最初以这种简单的方式保持bilanced从每个客户端发送的短信分发。
有没有办法只使用SQL来实现这个目的?
如果我加入客户端发送短信...如何只选择十个短信foreach客户端?
我正在使用InnoDb的MYSQL
答案 0 :(得分:1)
这在mysql中并不容易。这个问题有一些可能有用的答案:
特别是文章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
答案 1 :(得分:0)
编辑:我再次尝试,这次使用MySQL和小提琴来测试它。代码非常脏,我认为你可以在没有一些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