繁体   English   中英

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

[英]Complex SQL query issue (MYSQL Workbench 6.3)

我在弄清楚如何编写此查询时遇到了麻烦。 让我解释一下情况。

因此,问题是,我需要显示所有得分均大于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的分数得分世纪。

这些球员也已经在其他方面打了几个世纪,但是此查询显示了所有在这三个方面中任何一个打过的球员。

玩家也可以在其他地方玩,但是最低要求是玩家必须在所有地方玩。 1 3 5

所以,我需要的是,只有所有在相同方面和根据方面都发挥过作用的球员; 1 3 5

通过观察表格中的数据,我们可以看到以相同的理由参加比赛的玩家只有2个,即pid = 2、6。

任何想法如何去做?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM