2

我有一个梦幻足球经理和每支球队的 15 名球员的数据库。我可以执行以下操作来列出所有包含“Robin Van Persie”的球队。

SELECT * 
FROM `players` 
WHERE MATCH(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15) 
AGAINST ('Robin Van Persie' IN BOOLEAN MODE)

我可以这样做来计算其中有多少“Robin Van Persie”(仅返回一个数字)。

SELECT count(*) 
FROM `players` 
WHERE MATCH(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15) 
AGAINST ('Robin Van Persie' IN BOOLEAN MODE)

但是有没有办法让我得到一个类似的列表?

Count | Player Name
-------------------------
62    | Robin Van Persie
12    | Wayne Rooney
22    | Michu
31    | Theo Walcott

对于数据库中的每个不同的值?

4

1 回答 1

1

你真的想要三张桌子。

表 1
在“玩家”表中,您有 2 列:主 ID 和所有玩家的列表。

表 2
“managers”表也有 2 列:每个经理姓名和一个主 ID。

表 3
“managers_players”表将每个经理的主 ID 与她或他的团队中每个球员的主 ID 相关联。所以从技术上讲,这个表有 3 列:表主 ID、经理 ID 和球员 ID。因此,此表将具有相同经理 ID 和相同玩家 ID 的多个实例。

使用这种结构,您可以运行这样的查询(可能需要在内连接上使用“二进制”):

SELECT m.name, count(mp.player_id) as count
FROM managers_players mp
inner join managers m
on  mp.manager_id =  m.id
inner join players p
on p.id = mp.player_id
group by m.id
order by count DESC;

这种模式还可以很容易地查看每个经理团队中的球员:

SELECT p.name
FROM managers_players mp
inner join managers m
on m.id = mp.manager_id
inner join players p
on p.id = mp.player id
where m.name like '%Manager Name%';

或者select m.name更改 where 子句以p.name查看拥有特定球员的所有经理。

于 2013-05-23T03:49:12.260 回答