复杂的SQL查询问题(MYSQL Workbench 6.3)

时间:2018-05-28 21:40:27

标签: mysql mysql-workbench

我无法弄清楚如何编写此查询。 让我解释一下情况。

所以,这个问题, 我需要显示得分高于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。

知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

我认为这个查询应该做你想要的。它创建了一个第一个玩家玩过并创造了一个世纪(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 Demo