0

我有客户 客户可以有 N 个交付 每个交付可以有 N 个短信

Delivery 有 client_id Sms 作为 Delivery_id

我想从短信表中检索所有短信,但每个客户最多 10 条短信。

这是因为“短信”是要发送的短信队列。所以我想最初以这种简单的方式保持平衡,从每个客户端发送的短信的分布。

有没有办法只使用 SQL 来完成这个?

如果我加入客户发送到短信...如何为每个客户只选择十个短信?

我正在将 MYSQL 与 InnoDb 一起使用

4

2 回答 2

1

这在mysql中并不容易做到。这个 SO question 有一些可能有用的答案:

MySQL 中的 ROW_NUMBER()

特别是,文章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
于 2013-01-03T09:29:44.767 回答
0

编辑:我再次尝试,这次使用 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 代码

于 2013-01-03T09:27:11.930 回答