2016-03-17 57 views
0

我有以下SQL語句現在:得到行的數量有限,每聯接的列

SELECT m . * 
FROM newsletter_mail_list m 
INNER JOIN (
    SELECT n.id 
    FROM newsletter n 
    GROUP BY n.customer_id 
    ORDER BY n.id ASC 
) b ON m.newsletter_id = b.id 
WHERE m.sent_date IS NULL 

郵件列表表

+--------+-------+--------+--------+-----+ 
| id | newsletter_id | email | sent_date | 
+--------+-------+--------+--------+-----+ 
| 1 | 8    | abcd | today  | 
| 2 | 8    | cfdf | NULL  | 
| 3 | 8    | afdg | NULL  | 
| 4 | 9    | zfbh | NULL  | 
| 5 | 9    | eerg | NULL  | 
| 6 | 9    | ertg | NULL  | 
| 7 | 9    | zfbh | NULL  | 
| 8 | 9    | eerg | NULL  | 
| 9 | 9    | ertg | NULL  | 
| 10 | 9    | zfbh | NULL  | 
| 11 | 9    | eerg | NULL  | 
| 12 | 9    | ertg | NULL  | 
| 13 | 9    | zfbh | NULL  | 
| 14 | 9    | eerg | NULL  | 
| 15 | 9    | ertg | NULL  | 
| 16 | 9    | zfbh | NULL  | 
| 17 | 9    | eerg | NULL  | 
| 18 | 9    | ertg | NULL  | 
+--------+-------+--------+--------+-----+ 

所需的結果

+--------+-------+--------+--------+-----+ 
| id | newsletter_id | email | sent_date | 
+--------+-------+--------+--------+-----+ 
| 2 | 8    | cfdf | NULL  | 
| 3 | 8    | afdg | NULL  | 
| 4 | 9    | zfbh | NULL  | 
| 5 | 9    | eerg | NULL  | 
| 6 | 9    | ertg | NULL  | 
| 7 | 9    | zfbh | NULL  | 
| 8 | 9    | eerg | NULL  | 
| 9 | 9    | ertg | NULL  | 
| 10 | 9    | zfbh | NULL  | 
| 11 | 9    | eerg | NULL  | 
| 12 | 9    | ertg | NULL  | 
| 13 | 9    | zfbh | NULL  | 
+--------+-------+--------+--------+-----+ 

這一個給我所有mail_list行,其中sent_date爲NULL,並且外部時事通訊是客戶中最早的行。

現在我只想要最多10個mail_list行返回由子查詢返回的每個時事通訊。

實施例:

現在我得到21分的結果通過該SQL,屬於該通訊8 3個mail_lists和18個結果簡訊9. 但結果簡訊的數目9應該只有10個。

我怎麼能用SQL來做到這一點?這甚至有可能嗎?

+0

我們很高興地看到你嘗試了一些東西,但更好......考慮遵循這個簡單的兩步式行動:1.如果您還沒有這樣做,請提供適當的DDL(和/或sqlfiddle),以便我們可以更輕鬆地複製問題。 2.如果您尚未這樣做,請提供與步驟1中提供的信息相符的所需結果集。 – Strawberry

+1

謝謝@Strawberry,我編輯了我的問題 – KhorneHoly

回答

1

如:

SELECT x.* 
    FROM mail_list x 
    JOIN mail_list y 
    ON y.newsletter_id = x.newsletter_id 
    AND y.id <= x.id 
WHERE x.sent_date IS NULL 
GROUP 
    BY newsletter_id 
    , id 
HAVING COUNT(*) <= 10; 

如果性能是一個問題,然後用變量的解決方案會更快...

如:

SELECT id 
    , newsletter_id 
    , email 
    FROM 
    (SELECT x.* 
      , CASE WHEN @prev=newsletter_id 
        THEN @i:[email protected]+1 
        ELSE @i:=1 END i 
      , @prev:=newsletter_id prev 
     FROM mail_list x 
      , (SELECT @prev:='',@i:=0) vars 
     WHERE sent_date IS NULL 
     ORDER 
      BY newsletter_id, id 
    ) a 
WHERE i <= 10; 
+0

太棒了,完美的工作!你有可能通過變量解釋一個嘗試嗎? – KhorneHoly

+0

@KhorneHoly這是我給你的重複鏈接解釋 – Shadow

+0

@Shadow好的,謝謝,我會看看它。 – KhorneHoly