gpt4 book ai didi

mysql - 在 MYSQL 中分组之前如何对数据进行排序

转载 作者:行者123 更新时间:2023-11-29 02:37:59 25 4
gpt4 key购买 nike

我有一个很大的 mysql 查询,它需要遍历 4 个表来获取我的应用程序的所有“项目”。每个项目可以有多个类别,每个用户最多可以拥有一个项目。项目和类别很简单:

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;

这会生成我想要的大部分数据。但是我还需要知道每个项目是否由特定用户拥有。所以我简单地添加了另一个连接和一个 bool 列:

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 |
+--------+--------+-----------+----------+---------+

我想要每个项目的id、名称、类型所有类别以及用户是否有一个。同样的数据集,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 |
+--------+--------+-----------+----------+---------+

Slug 的 userHas = 1 字段已在 GROUP BY 中丢失。我想保存它。

最佳答案

更新:

这将选择所有项目并显示用户 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

关于mysql - 在 MYSQL 中分组之前如何对数据进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1974040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com