首页 > 解决方案 > 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 
     (...)

标签: mysql

解决方案


如果项目的顺序不清楚,并且您想在那里选择不同的项目,您可以这样做:

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 的行。232

注意:这不是一个高效的解决方案。仅当您使用订购的物品(如@Naktibalda 在评论中所建议的那样)时,您可能会找到更高效的解决方案。

DBFIDDLE


推荐阅读