我有一个Fantasy Football Managers数据库,每个团队都有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
对于数据库中的每个不同值?
答案 0 :(得分:1)
你真的想拥有三张桌子。
表1
在"球员"表,您有2列:主要ID,以及所有玩家的列表。
表2
"经理"表还有2列:每个管理器名称和主要ID。
表3
"经理_玩家" table将每个经理的主要ID与其团队中每个玩家的主要ID相关联。从技术上讲,这个表有3列:表主ID,管理员ID和玩家ID。因此,此表将具有相同经理ID和相同玩家ID的多个实例。
使用此结构,您可以运行这样的查询(可能需要在内部联接上使用" binarys"):
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
,以查看拥有特定玩家的所有经理。