Mysql 查找具有可互换行的类似条目

Mysql 查找具有可互换行的类似条目,mysql,sql,Mysql,Sql,我有一个MySQL表,其中包含NPC的条目。每个NPC有3个技能槽。每个插槽有两个可能的值 我正在努力寻找类似的NPC。类似的意思是:每个NPC可以用这6种能力构建相同的能力组合。插槽可以互换,但a和b值始终保持在一起 示例:下表中的NPC 40和41类似。NPC 42与它们不同,因为它无法构建相同的能力组合,即使6个法术ID相同: NPC 40和41可以使用能力:492+429+538 NPC 42不能,因为492和429在同一插槽上 NPC +-----+---------+--------

我有一个MySQL表,其中包含NPC的条目。每个NPC有3个技能槽。每个插槽有两个可能的值

我正在努力寻找类似的NPC。类似的意思是:每个NPC可以用这6种能力构建相同的能力组合。插槽可以互换,但a和b值始终保持在一起

示例:下表中的NPC 40和41类似。NPC 42与它们不同,因为它无法构建相同的能力组合,即使6个法术ID相同:

NPC 40和41可以使用能力:492+429+538

NPC 42不能,因为492和429在同一插槽上

NPC
+-----+---------+---------+---------+---------+---------+---------+
| id  | slot_1a | slot_1b | slot_2a | slot_2b | slot_3a | slot_3b |
+-----+---------+---------+---------+---------+---------+---------+
| 39  |    384  |    202  |    389  |    392  |    459  |     278 |
| 40  |    429  |    535  |    492  |    357  |    538  |     536 |
| 41  |    492  |    357  |    429  |    535  |    538  |     536 |
| 42  |    492  |    429  |    357  |    535  |    538  |     536 |
+-----+---------+---------+---------+---------+---------+---------+
如果我没有弄错的话,类似的NPC有48种可能的组合。现在我想知道是否有一个更简单的解决方案来找到类似的NPC,然后检查所有48个组合

SQL FIDLE(新数据):


编辑:忘了提到,每个插槽的值也可以切换其位置。这可能就是@Kostas Mitsarakis不能100%工作的原因。

我几乎可以肯定有更好的方法,但您可以尝试一下。您必须检查每个插槽组合是否与其他插槽组合匹配


可能不是最好的解决方案,但我就是这样解决的:

SELECT group_concat( npc_id separator ','),
@slot1:= concat_ws(',',least(slot_1a,slot_1b),greatest(slot_1a,slot_1b)) AS slot1,
@slot2:= concat_ws(',',least(slot_2a,slot_2b),greatest(slot_2a,slot_2b)) AS slot2,
@slot3:= concat_ws(',',least(slot_3a,slot_3b),greatest(slot_3a,slot_3b)) AS slot3,
@min:=least(least(@slot1,@slot2),@slot3) as min,
@max:=greatest(greatest(@slot1,@slot2),@slot3) as max,
@med:=(
CASE
    when @slot1 != @min and @slot1 != @max then @slot1
    when @slot2 != @min and @slot2 != @max then @slot2
    when @slot3 != @min and @slot3 != @max then @slot3
END
) AS med,
concat_ws(',',@min,@med,@max) AS move_set
FROM npc
GROUP by move_set

你能在一个SQL FIDLE中提供一些示例数据吗?在原始文章中添加了一个SQL FIDLE。它可以工作。您忘记在“slot_1a”列中的id 40中添加“2”(它是29而不是429)。请使用实际数据重新检查,遗憾的是,此解决方案无法100%正常工作,您能否向SQL Fiddel提供大量实际数据样本以进行检查?
SELECT group_concat( npc_id separator ','),
@slot1:= concat_ws(',',least(slot_1a,slot_1b),greatest(slot_1a,slot_1b)) AS slot1,
@slot2:= concat_ws(',',least(slot_2a,slot_2b),greatest(slot_2a,slot_2b)) AS slot2,
@slot3:= concat_ws(',',least(slot_3a,slot_3b),greatest(slot_3a,slot_3b)) AS slot3,
@min:=least(least(@slot1,@slot2),@slot3) as min,
@max:=greatest(greatest(@slot1,@slot2),@slot3) as max,
@med:=(
CASE
    when @slot1 != @min and @slot1 != @max then @slot1
    when @slot2 != @min and @slot2 != @max then @slot2
    when @slot3 != @min and @slot3 != @max then @slot3
END
) AS med,
concat_ws(',',@min,@med,@max) AS move_set
FROM npc
GROUP by move_set