创建ID的唯一组合

时间:2019-03-20 15:00:05

标签: mysql

我正在尝试建立一个数据库结构,其中每个唯一的玩家组合都有自己的lineup_id。值得注意的是,每个团队中可能有n个球员。

以下是表结构的示例:

create table lineup_mapping (
lineup_id int,
player_id int,
primary key (lineup_id,player_id)
);

insert into lineup_mapping (lineup_id,player_id) values 
(1,25),(1,26),(1,14),
(2,15),(2,36),(2,25),
(3,25),(3,36),(3,25),(3,45);

我将获得一份player_ids列表(在python中),我希望能够查询到这个player_ids的独特组合是否已经拥有自己的lineup_id或我是否需要创建一个新的。

我认为有可能使用group by和different的组合,但是我一直在努力提出能够解决整个任务的任何查询。

我还应该指出,玩家出现的顺序并不重要。如果他们在一起玩过,应该算作唯一的lineup_id。

2 个答案:

答案 0 :(得分:0)

如果所有阵容都恰好有N个玩家,则可以使用N个子查询的交集找到答案。在MS SQLServer中,可能看起来像这样(N = 3):

SELECT lineup_id FROM lineup_mapping WHERE player_id = <player1>
INTERSECT SELECT lineup_id FROM lineup_mapping WHERE player_id = <player2>
INTERSECT SELECT lineup_id FROM lineup_mapping WHERE player_id = <player3>

但是MySQL没有INTERSECT,因此您需要做更多的工作。一种方式:

SELECT map1.lineup_id FROM lineup_mapping map1 
WHERE map1.player_id = <player1> 
AND map1.lineup_id IN (
    SELECT map2.lineup_id FROM lineup_mapping map2 
    WHERE map2.player_id = <player2>)
AND map1.lineup_id IN (
    SELECT map3.lineup_id FROM lineup_mapping map3 
    WHERE map3.player_id = <player3>)

未经测试,但希望您能理解。

答案 1 :(得分:0)

即使您不提前知道N,或者阵容不一定都拥有相同数量的玩家,这也是一种有效的方法。

这个想法是为每个玩家组合构建一个唯一的密钥。例如,您可以对玩家ID列表进行排序,然后将其附加到字符串中。 (例如,玩家1、8、3和4的键为“ 1-3-4-8”。)如果该键存在于您的表格中,则说明该阵容已经使用。

我们可以使用以下新键创建新的阵容映射表:

INSERT INTO new_lineup_mapping (lineup_id, players_key) 
VALUES (1, '14-25-26'), (2, '15-25-26'), (3,'25-36-45-51'); 

查询将简单地是:

SELECT lineup_id FROM new_lineup_mapping WHERE players_key = ?

或者,您可以保持原始表结构并即时构建播放器键。我认为MySQL具有GROUP_CONCAT函数,可以正常工作。查询如下所示:

SELECT lineup_id, GROUP_CONCAT(DISTINCT player_id
                  ORDER BY player_id ASC SEPARATOR '-') AS players_key
FROM lineup_mapping GROUP BY lineup_id
HAVING players_key = ?

无论哪种方式,调用查询的代码都需要为要搜索的玩家列表构建唯一键。这不是很理想,但是要解决该问题,您可能必须编写一个存储过程。