mysql - 创建唯一的 ID 组合

标签 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 和 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/

相关文章:

php - 使用 PHP 从多个 MySQL 表进行查询

php - 如何使用php mysql检索行值

mysql - 添加多列和外键

mysql - 在两列中查找具有最大匹配字符串的行

mysql - 从 mysql 表中检索所有未登录的用户(SQL 查询)

MySql 行转列

mysql - 选择语句格式

php - 'PDOException' 消息 'SQLSTATE[HY093] : Invalid parameter number:

mysql - mysqli连接仅在硬编码时有效

PHP/MySQL : Combine UPDATE queries?