我有一個很大的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丟失。我想保存它。
你試圖通過這個實現:UserItems.userId = 7654321? – afftee 2009-12-29 11:07:32
對不起,我應該說。這是我的示例用戶userId的布爾列。該列根據行是否對應於該用戶輸出true或false。 – peterjwest 2009-12-29 11:09:43
這可能是一個情況,它會有助於看到你想要實現的樣本。我自己並不完全清楚。 – 2009-12-29 11:11:39