我正在尝试建立一个数据库结构,其中每个独特的球员组合都有自己的 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 和 distinct,但我正在努力想出解决整个任务的任何查询。
我还应该指出,玩家出现的顺序并不重要。如果他们一起打过球,那应该算作一个唯一的 lineup_id。
最佳答案
即使您事先不知道 N,或者如果阵容不一定都具有相同数量的球员,这里的方法仍然有效。
我们的想法是为每个玩家组合构建一个唯一的 key 。例如,您可以对播放器 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 = ?
无论哪种方式,调用查询的代码都需要为其正在搜索的玩家列表构建唯一键。这并不理想,但要解决该问题,您可能必须编写一个存储过程。
关于mysql - 创建唯一的 ID 组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55263904/