2009-12-29 98 views
2

我有一個很大的mysql查詢需要通過4個表來拖拽我的應用程序的所有'項目'。每個項目可以有多個類別,每個用戶最多可以有一個項目。項目和類別很容易:如何在MYSQL中分組之前對數據進行排序

SELECT Items.itemId, Items.name, Items.type, Categories.name AS category 
FROM Items 
LEFT JOIN ItemCategories ON Items.itemId = ItemCategories.itemId 
LEFT JOIN Categories ON ItemCategories.categoryId = Categories.categoryId; 

這產生了大部分我想要的數據。不過,我還需要知道每個項目是否屬於特定用戶。所以我簡單地添加了另一個連接和一個布爾列:

SELECT Items.itemId, Items.name, Items.type, Categories.name AS category, 
UserItems.userId = 7654321 AS userHas FROM Items 
LEFT JOIN ItemCategories ON Items.itemId = ItemCategories.itemId 
LEFT JOIN Categories ON ItemCategories.categoryId = Categories.categoryId 
LEFT JOIN UserItems ON Items.itemId = UserItems.itemId; 

問題在於它會產生大量不想要的結果。例如,如果我有500個用戶,每個用戶有50個項目,那麼會有25,000個行。由於數據庫中只有大約100個項目,每個項目大約有3個類別,我只需要大約300行。基本上我並不需要了解其他用戶可能有一個項目,只有我感興趣的特定用戶

我的下一步是嘗試分組行:

GROUP BY Items.itemId, Categories.name 

然而這並未不要確保userHas列中的用戶數據得到保留。我試圖通過userHas DESC排序,但似乎在GROUP BY之後應用。

我有一種感覺,解決方案可能涉及以下功能之一:http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html 但我堅持什麼或如何。我知道在一個查詢中甚至可能不可能。

下面是一些輸出(不使用GROUP BY):

+--------+--------+-----------+----------+---------+ 
| itemId | name | type  | category | userHas | 
+--------+--------+-----------+----------+---------+ 
|  1 | Llama | character | animal | NULL | 
|  1 | Llama | character | nice  | NULL | 
|  2 | Slug | character | animal |  0 | 
|  2 | Slug | character | animal |  1 | 
|  2 | Slug | character | nasty |  0 | 
|  2 | Slug | character | nasty |  1 | 
|  3 | Sloth | character | animal |  1 | 
|  3 | Sloth | character | animal |  0 | 
|  4 | Banana | character | fruit |  0 | 
|  4 | Banana | character | animal |  0 | 
+--------+--------+-----------+----------+---------+ 

我想每個項目編號,名稱,類型所有類別以及用戶是否有一個。同一數據集與GROUP BY Items.itemId,Categories.name樣子:

+--------+--------+-----------+----------+---------+ 
| itemId | name | type  | category | userHas | 
+--------+--------+-----------+----------+---------+ 
|  1 | Llama | character | animal | NULL | 
|  1 | Llama | character | nice  | NULL | 
|  2 | Slug | character | animal |  0 | 
|  2 | Slug | character | nasty |  0 | 
|  3 | Sloth | character | animal |  1 | 
|  4 | Banana | character | animal |  0 | 
|  4 | Banana | character | fruit |  0 | 
+--------+--------+-----------+----------+---------+ 

的userHas = 1個字段彈頭已在GROUP BY丟失。我想保存它。

+0

你試圖通過這個實現:UserItems.userId = 7654321? – afftee 2009-12-29 11:07:32

+0

對不起,我應該說。這是我的示例用戶userId的布爾列。該列根據行是否對應於該用戶輸出true或false。 – peterjwest 2009-12-29 11:09:43

+0

這可能是一個情況,它會有助於看到你想要實現的樣本。我自己並不完全清楚。 – 2009-12-29 11:11:39

回答

2

更新:

這將選擇所有項目,並顯示在用戶7654321擁有它們。

SELECT Items.itemId, Items.name, Items.type, Categories.name AS category, 
     NOT(ISNULL(UserID)) AS userHas 
FROM Items 
LEFT JOIN 
     ItemCategories 
ON  Items.itemId = ItemCategories.itemId 
LEFT JOIN 
     Categories 
ON  ItemCategories.categoryId = Categories.categoryId 
LEFT JOIN 
     UserItems 
ON  UserItems.itemId = Items.itemID 
     AND UserItems.userId = 7654321 
+0

這就是我第一次嘗試。但它過濾掉了用戶沒有的項目,我想在標記用戶具有的項目時保留它們。 – peterjwest 2009-12-29 11:22:08

+0

哦,我的上帝,它是美麗的。非常感謝你。 – peterjwest 2009-12-29 11:31:44

+0

不應該是(ISNULL(UserID)) – peterjwest 2009-12-29 11:39:35

0

您是否嘗試過UserHas列添加到GROUP BY條款?

+0

是的,我做到了,那時候GROUP BY子句什麼都不做。 – peterjwest 2009-12-29 11:35:44

相關問題