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

标签 mysql mysql-workbench

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

所以,问题是, 我需要显示得分大于 99 的所有球员姓名,他们在某个球员(例如 pid = 1)参加过比赛并且得分大于 99 的所有相同 field 参加过比赛。 (除了 pid = 1 打过的 field 之外,他们还可以在其他 field 打球,但最低要求是他们必须与他在所有相同的 field 打球)。

我有一个数据库,由3个表组成;球员、 field 、比赛。以及以下数据。

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 的同一 field 进行过比赛的玩家。如何显示在 pid = 1 的所有同一 field 进行过比赛的玩家。

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 时获得了世纪得分。

这些玩家也在其他 field 打了几个世纪,但此查询显示在 3 个 field 中任何一个打过球的所有玩家。

球员也可以在其他 field 比赛,但最低要求是球员必须在所有 field 比赛; 1、3、5。

所以,我需要的是,只有所有那些在所有相同 field (如 field )比赛过的球员; 1、3、5。

通过 table 赛数据观察,在所有同一个 field 进行比赛的选手只有2人,即pid = 2, 6。

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

最佳答案

我认为这个查询应该做你想要的。它会创建一个 field 表,其中第一个玩家已经打过球并打了一个世纪 (g1),并将其与也在这些 field 打过球的玩家连接起来。如果另一名球员打过球的不同 field 的数量与第一位球员打过球的不同 field 的数量相同,则他们必须在同一组 field 打球。请注意,有几个地方(在两个子查询中)需要设置玩家 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

关于mysql - 复杂的SQL查询问题(MYSQL Workbench 6.3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50573690/

相关文章:

mysql - 选择数据 `not exists` 并选择空列或 `is null` - MySQL

MySQL 没有解析 IP 地址,但 nslookup 确实解析了

php - $wpdb 查询从匹配特定 ID 的列中对 SQL 小数求和

MySQL - 结合 SELECT 两个表

mysql - Yii 切换数据库字段

mysql - 我可以使用 t1 行作为 t2 行的键从两个表中选择行吗?

mysql - 向 MySQL 表中的一群人发送 HTML 电子邮件的最佳方式?

MySQL 在搜索 'ずる' 时返回 'する'(日语)

mysql - 在 Windows 8.1 上覆盖路径内容 - 环境变量

MySQL 存储函数