复杂的sql查询问题(mysql workbench 6.3)

0tdrvxhp  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(352)

我很难想出如何写这个查询。我来解释一下情况。
所以,问题是,我需要显示所有得分大于99的球员的名字,他们在所有相同的场地打过比赛,其中某个球员(例如pid=1)打过比赛,得分大于99(他们本可以在一个pid=1的场地之外的其他场地打球,但最低要求是他们必须和他在同一个场地打球)。
我有一个数据库,其中包括3个表;球员,场地,火柴。以及以下数据。

create database test1;
use test1;

CREATE TABLE `player` (
  `pid` int(11) NOT NULL,
  `pname` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `ground` (
  `gid` int(11) NOT NULL,
  `gname` varchar(20) DEFAULT NULL,
  `country` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `matches` (
  `pid` int(11) DEFAULT NULL,
  `gid` int(11) DEFAULT NULL,
  `score` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `player` ADD PRIMARY KEY (`pid`);

ALTER TABLE `ground` ADD PRIMARY KEY (`gid`);

ALTER TABLE `matches`
  ADD KEY `gid` (`gid`),
  ADD KEY `pid` (`pid`);

INSERT INTO `player` (`pid`, `pname`) VALUES
(1, 'afridi'),
(2, 'kohli'),
(3, 'imam'),
(4, 'fawad'),
(5, 'baven'),
(6, 'awais');

INSERT INTO `ground` (`gid`, `gname`, `country`) VALUES
(1, 'Qaddafi', 'PK'),
(2, 'National', 'PK'),
(3, 'Eden Garden', 'IND'),
(4, 'Lords', 'ENG'),
(5, 'MCG', 'AUS'),
(6, 'Arbab Nayyaz', 'PK');

INSERT INTO `matches` (`pid`, `gid`, `score`) VALUES
(1, 2, 23),
(1, 1, 111),
(2, 3, 107),
(2, 5, 103),
(1, 3, 117),
(1, 4, 55),
(1, 5, 101),
(1, 6, 44),
(2, 6, 103),
(2, 4, 103),
(2, 2, 117),
(2, 1, 103),
(4, 1, 77),
(3, 1, 13),
(5, 2, 22),
(3, 2, 101),
(3, 3, 101),
(5, 1, 101),
(5, 4, 101),
(5, 5, 101),
(6, 1, 101),
(6, 2, 101),
(6, 3, 101),
(6, 4, 101),
(6, 5, 101),
(6, 4, 101);

相对简单的数据库。
我已经编写了下面的查询,其中显示了4个玩家的名字。它将显示在pid=1的同一场地上踢球的所有球员。如何仅显示那些在pid=1的所有相同场地上玩过的玩家。

select p.pname 
from player p
join matches mn on mn.pid = p.pid
where (p.pid != 1) and (mn.score > 99) and exists (select m.gid from matches m where (m.pid = 1) and (mn.gid = m.gid))
group by pname;

根据表中提供的数据,afridi(pid=1)在以下方面得分:;1、3和5。
玩家(pid)2、3、5、6分别在场地1、3和5中得分。
这些玩家在其他场地也有数百年的历史,但是这个查询显示了所有在3个场地中的任何一个打过球的玩家。
球员也可以在其他场地比赛,但最低要求是球员必须在所有场地比赛;1, 3, 5.
所以,我需要的是,只有那些在同一个场地上踢球的球员,就像在球场上一样;1, 3, 5.
从观察数据表中的比赛,我们可以看到,球员在所有相同的理由是只有2,pid=2,6。
你知道怎么做吗?

9rnv2umw

9rnv2umw1#

我认为这个查询应该满足您的要求。它创造了一张场地表,第一个球员在这里打了一个世纪的球( g1 ),并将此加入到同样在这些场地打球的球员中。如果另一名球员在不同场地的数量与第一名球员在不同场地的数量相同,则他们必须在同一组场地上同时比赛。注意,有几个地方(在两个子查询中)需要设置播放器id以进行比较。

SELECT p.pname
FROM (SELECT gid, pid FROM matches WHERE pid=1 AND score >= 100) g1
LEFT JOIN matches m
ON m.gid = g1.gid AND m.pid != g1.pid
JOIN player p
ON p.pid = m.pid
GROUP BY m.pid
HAVING COUNT(DISTINCT m.gid) = (SELECT COUNT(DISTINCT gid) FROM matches WHERE pid=1 AND score >= 100)
ORDER BY m.pid

sqlfiddle演示

相关问题