mysql - MySQL 中的 SELECT 列排列
问题描述
我有一个包含 7 列的表,其中包含项目(以及其他包含数据的列)。当我存储(游戏)数据时,项目的顺序很重要。但现在我想做一个订单不相关的查询,只是用户使用了特定的项目组合。
编辑:我想要特定角色(cID)在游戏中使用项目 1,2,3,... 的所有结果。玩家将某个项目用作第一个项目 (item1) 还是最后一个并不重要。
id |cID |item1 |item2 |item3
1 | 5 | 3 | 1 | 0
2 | 1 | 4 | 2 | 1
3 | 2 | 1 | 3 | 2
4 | 2 | 2 | 2 | 2
目前,查询如下所示:
SELECT *
FROM userdata
WHERE item1 IN (1,2,3)
AND item2 IN (1,2,3)
AND item3 IN (1,2,3)
AND cID = 2
但后来我必须过滤结果。在这个例子中,我只想要 id 3 但得到 id 3 和 id 4。
有没有办法直接用查询来做到这一点?
EDIT2:纯文本查询将是这样的:
给我一个用户玩过 x 字符并使用这 7 个项目的所有行。
用户可以按任何顺序使用这些项目。我得到的数据包含用户使用这些项目的顺序。但是对于这个查询,这个顺序是不相关的,只有当用户在一个游戏中使用了特定的项目集时它才相关。(1,2,3) 和 (2,3,1) 是等价的。用户也可以多次拥有相同的项目,这意味着 (1,1,1) 是用户拥有 3 次项目“1”的有效条目。
当搜索的项目集包含 7 个不同的项目时,查询中的所有排列意味着超过 5k 的“或”语句。这会起作用,但似乎不对。
就像示例一样,对项目集 (1,2,3) 的查询如下所示:
SELECT *
FROM userdata
WHERE
(item1 = 1 AND item2 = 2 AND item3 = 3 AND cID = 2)
OR
(item1 = 1 AND item2 = 3 AND item3 = 2 AND cID = 2)
OR
(...)
解决方案
如果项目的顺序不清楚,并且您想在那里选择不同的项目,您可以这样做:
SELECT *
FROM userdata
WHERE item1 IN (1,2,3)
AND item2 IN (1,2,3) and item2<>item1
AND item3 IN (1,2,3) and item3<>item1 and item3<>item2
AND cID = 2;
这将选择 items和存在的行1
,而不再选择只有 item 和 value 的行。2
3
2
注意:这不是一个高效的解决方案。仅当您使用订购的物品(如@Naktibalda 在评论中所建议的那样)时,您可能会找到更高效的解决方案。
推荐阅读
- python - 打印嵌套字典循环 YYYYMMDD
- apache-spark - Py4JError:调用 o52.fit 时出错
- php - dns_get_record 它失败了,我能够控制错误
- r - 如何保存2次多项式线性模型的系数并稍后在R中进行预测?
- ruby-on-rails - 修复 TypeError:没有将 Arel::Nodes::SqlLiteral 隐式转换为 Integer
- excel-formula - 我可以在 Excel 中使用符合 countif 范围的动态标准吗?
- javascript - 无法读取未定义和未处理的承诺拒绝的属性“捕获”
- sql - 基于两列之间的差距的重复记录
- windows - 错误:在 Windows 10 中安装 GNU octave 包时“不允许捆绑包”
- javascript - 提交时停止计算器刷新页面