2013-07-15 95 views
0

我有一個列表和一個列表項目表。我想制定一個查詢來爲列表中的每個項目選擇一個列表項目。下面是一些簡單的數據來說明我的問題:如何爲每個父記錄選擇一個子表項?

'lists' table 
id updated share 
--- ---------- ----- 
1 2013-07-11 1 
2 2013-07-13 0 
3 2013-07-15 1 
4 2013-07-14 0 
5 2013-07-14 1 

'list_items' table 
id l_id description sort likes 
-- ---- ----------- ---- ----- 
1 1 hello  0  3 
2 1 goodbye  0  0 
3 1 thanks  0  4 
4 2 ok   0  0 
5 3 love  0  2 
6 3 hate  1  1 
7 4 celebrate 0  0 
8 5 party  0  1 
9 5 summer  1  5 
10 5 winter  2  2 

現在說我想從每個共享列表(份額= 1),得到的第一個項目。首先,我的意思是如果列表項按「排序」排序。

基於上述數據預期的結果將是:

lists.id id l_id description sort likes 
-------- -- ---- ----------- ---- ----- 
    1  1 1 hello  0  3 
    3  5 3 love  0  2 
    5  8 5 party  0  1 

更新: 我努力讓我的頭周圍的peterm和hims056和而提供的解決方案凱拉的解決方案看起來更象是我可以按照它沒有返回正確的結果。以思想從這些解決方案我有裂紋,在它自己與

SELECT * FROM (
    SELECT lists.id AS listid, lists.share, list_items.* 
    FROM list_items, lists 
    WHERE lists.id = l_id 
    AND lists.share = 1 
    ORDER BY sort) q 
    GROUP BY q.listid 

這似乎是工作上來,但作爲peterm指出,在SELECT子句中的列不屬於組的一部分by子句中的值可能不明確。

我雖然有人會想出使用LIMIT的解決方案,因爲這是我首先想到的方式。您可以返回其允許通過簡單的共享目錄ID:

SELECT lists.id FROM lists WHERE share = 1 

和給定列表ID可以通過返回頂部列表項:

SELECT lists.id AS listid, lists.share, list_items.* 
FROM list_items, lists 
WHERE lists.id = l_id 
AND lists.id = 1 
ORDER BY sort 
LIMIT 1 

但是有沒有把這些2的方式聲明一起返回每個允許共享的列表的頂部列表項目?

+0

沒有任何答案對您有幫助嗎? – hims056

回答

1

修訂爲了確保sort獲得第一每組有爲了儘量

SELECT q.l_id list_id, q.id, i.description, i.sort, i.likes 
    FROM 
(
    SELECT l_id, id, @n := IF(@g = l_id, @n + 1, 1) n, @g := l_id g 
    FROM 
    (
    SELECT i.l_id, i.id 
     FROM list_items i JOIN lists l 
     ON i.l_id = l.id 
    WHERE l.share = 1 
    ORDER BY l_id, sort, id 
) b CROSS JOIN (SELECT @n := 0, @g := 0) a 
    HAVING n = 1 
) q JOIN list_items i 
    ON q.id = i.id 

輸出示例:

 
| LIST_ID | ID | DESCRIPTION | SORT | LIKES | 
--------------------------------------------- 
|  1 | 1 |  hello | 0 |  3 | 
|  3 | 5 |  love | 0 |  2 | 
|  5 | 8 |  party | 0 |  1 | 

這裏是SQLFiddle演示

+0

OP說:*首先,我的意思是,如果列表項按'sort'排序*因此,當[sort is 1 where hello]時,此查詢將不起作用(http://sqlfiddle.com/#!2/ 4519f6/1) – hims056

+0

[Still description = hello](http://sqlfiddle.com/#!2/4519f6/10)即將到來,我們把排序= 1。 – hims056

+1

@ hims056公平的。謝謝。它是固定的。 – peterm

1
SELECT lists.id, list_items.id, l_id, description, sort, likes 
    FROM (SELECT * FROM lists WHERE share = 1) lists 
    LEFT JOIN (SELECT * FROM list_items GROUP BY l_id) list_items 
    ON lists.id = l_id 
+0

看起來它沒有根據排序順序選擇正確的列表項,但我喜歡更簡單的方法。我想出了SELECT * FROM( SELECT lists.id AS listid,lists.share,list_items。* FROM list_items,lists WHERE lists.id = l_id AND lists.share = 1 ORDER BY sort) q GROUP BY q.listid'但我不是100%確定它是否正確 – AidanCurran

+0

我認爲它很好,只要你能顯示你想要的所有數據,但請注意你的連接,試着添加另一個可能的輸入數據,並確保它會顯示穩定的結果 – kayla

0

既然你想獲得最低list_items.id排序條件爲list_items.sort,你需要這樣的執行雙重嵌套查詢:

SELECT tbl.l_id list_id, tbl.minID, li.description, li.sort, li.likes 
FROM list_items li 
JOIN 
(
    SELECT l.l_id,MIN(l.id) minID FROM list_items l 
    JOIN 
    (
     SELECT li.l_id,MIN(li.sort) sort FROM list_items li 
      JOIN lists l ON li.l_id = l.id WHERE l.share = 1 
     GROUP BY li.l_id 
    ) l2 
    ON l.l_id = l2.l_id 
    AND l.sort = l2.sort 
    GROUP BY l.l_id 
) tbl 
ON li.id = tbl.minID; 
相關問題