SQL:帮我选择1 - >中的记录。 N - >; N关系

时间:2013-01-03 09:22:18

标签: mysql sql

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

交付有client_id 短信作为Delivery_id

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

这是因为'sms'是要发送的短信队列。所以我想最初以这种简单的方式保持bilanced从每个客户端发送的短信分发。

有没有办法只使用SQL来实现这个目的?

如果我加入客户端发送短信...如何只选择十个短信foreach客户端?

我正在使用InnoDb的MYSQL

2 个答案:

答案 0 :(得分:1)

这在mysql中并不容易。这个问题有一些可能有用的答案:

ROW_NUMBER() in 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

这里有SQLFiddle code