2016-11-08 45 views
1

給定兩個表:PHP第一次分揀非空組的列表,然後空組

item_to_group ---> contain item_id , user_to_group_id 
user_to_group ---> contain user_to_group_id , user_id, // other not relevant columns like group name... 

這裏我的MySQL代碼:

SELECT *, 
(SELECT COUNT(*) FROM item_to_group x 
WHERE x.user_to_group_id = u.user_to_group_id) as tots 
FROM user_to_group u 
WHERE u.user_id = // [ USERID HERE ] 
ORDER BY u.user_to_group_id DESC, tots DESC 

我想展示組的列表,在頂部我有他們的項目組,然後是空組。

想象一下這些羣體,比如電子商務中物品的願望清單。作爲一個用戶,我可以建立多個組。

例如。 我目前顯示

group 99 contains 2 items 
group 98 contains 0 items // <--- empty 
group 97 contains 5 items 
group 96 contains 1 items 
group 94 contains 0 items // <--- empty 
group 93 contains 9 items 
group 92 contains 3 items 

,但我想顯示

group 99 contains 2 items 
group 97 contains 5 items 
group 96 contains 1 items 
group 93 contains 9 items 
group 92 contains 3 items 
------------------------- 
group 98 contains 0 items 
group 94 contains 0 items 

所以我想顯示非空第一組,按時間順序(我不存儲時間戳但集團編號應該足夠我猜)然後所有剩下的空組。

這裏的問題是,如果我按id排序,那麼totsi不會得到我想要的結果。 我希望我很清楚。

+1

你可以添加一個樣本輸出?我不清楚你想要什麼排序。爲什麼你會先按id排序? *按時間順序*適合於哪裏? – LSerni

+0

@ lserni ok我加了個例子,謝謝 – Francesco

回答

0

您想對ORDER BY子句中的第一個位置的其他列進行排序(以使其最相關)。您無法直接在tots上排序,因爲這會破壞user_to_group_id上的排序。因此,您需要將除0之外的所有值都映射爲單個值 - 例如, 1.這可以使用CASE,給予以下ORDER BY子句來完成:

ORDER BY CASE WHEN tots = 0 THEN 0 ELSE 1 END DESC 
     , u.user_to_group_id DESC 
     , tots DESC 

現在,那些具有tots <> 0,將排在第一位,然後那些tots = 0其餘的排序是相同的。

如果您想了解更多關於CASE看看文章,我寫在這裏:http://modern-sql.com/feature/case

+0

哇從來沒有聽說過CASE,謝謝!! – Francesco