0

クライアントクライアントはN個の配信を行うことができます各配信はNSmsを使用できます

Deliveryには、Delivery_idとしてclient_idSMSがあります

SmsテーブルからすべてのSMSを取得したいのですが、クライアントごとに最大10のSMSを取得します。

これは、「sms」が送信するSMSのキューであるためです。だから私は最初はこの簡単な方法ですべてのクライアントから送信されたSMSの配布を二分していきたいと思います。

SQLのみを使用してこれを実現する方法はありますか?

クライアントに参加してSMSに配信する場合...クライアントごとに10個のSMSのみを選択するにはどうすればよいですか?

InnoDbでMYSQLを使用しています

4

2 に答える 2

1

これを mysql で行うのは簡単ではありません。この SO の質問には、役立つ可能性のある回答がいくつかあります。

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 に答える