Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复杂的SQL查询问题(MYSQL Workbench 6.3)_Mysql_Mysql Workbench - Fatal编程技术网

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

复杂的SQL查询问题(MYSQL Workbench 6.3),mysql,mysql-workbench,Mysql,Mysql Workbench,我不知道如何编写这个查询。 让我解释一下情况 那么这个问题,, 我需要显示得分大于99分的所有球员姓名,这些球员在某个球员(例如pid=1)参加过且得分大于99分的所有相同场地进行过比赛。 (除了pid=1的场地外,他们还可以在其他场地打球,但最低要求是他们必须和他在同一场地打球) 我有一个数据库,由3个表组成;球员、场地、比赛。以及以下数据 create database test1; use test1; CREATE TABLE `player` ( `pid` int(11) NO

我不知道如何编写这个查询。 让我解释一下情况

那么这个问题,, 我需要显示得分大于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)在以下方面得分:;一,三,五

球员(pid)2、3、5、6分别在场地1、3和5中得分

这些球员也在其他场地打了几百年球,但此查询显示了所有在3个场地中任何一个场地打过球的球员

球员也可以在其他场地比赛,但最低要求是球员必须在所有场地比赛;一,三,五

所以,我需要的是,只有那些在同一场地上打球的球员,就像在球场上一样;一,三,五

从观察表格比赛的数据中,我们可以看到在所有相同场地比赛的球员只有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

希望您自己尝试编写代码。如果您有问题,请发布您尝试过的内容,并清楚解释哪些内容不起作用,然后提供。阅读一定要阅读,看看我上面评论中的链接。他们会解释你需要补充什么才能得到答案。具体来说,到目前为止您尝试过什么样的SQL语句?最后,如果您在问题中以代码(而不是图像)的形式包含示例数据,我们可以创建一个SQL FIDLE来向您展示一个解决方案kemosabe@SloanThrasher谢谢你的帮助。我是新手,这个答案有用吗?如果没有,您能提供更多信息帮助解决问题吗?根据表中提供的数据,Afridi(pid=1)在以下方面为century打分:;一,三,五。分别有2名、3名、5名和6名球员(pid)在场地上得分;一,三,五。这些球员在其他场地也取得了数百年的成绩。但是这个查询只显示1名球员,他们在所有3个场地都打过球。球员也可以在其他场地比赛,但最低要求是球员必须在所有相同场地比赛;1,3,5。所以,我需要的是,所有的球员,他们在同一个场地上打球,就像在球场上一样;1, 3, 5. 通过观察表格比赛中的数据,我们可以看到在所有相同场地上比赛的球员只有2名,pid=2,6。嗨,萨米,你没有提到球员在这些场地上得分一个世纪的要求。这个查询只是告诉您哪些玩家与其他玩家在同一场地玩过。在本例中,玩家1(Afridi)已经在所有6个场地上打过球,因此它会给出同样在所有6个场地上打过球的玩家的列表,也就是玩家2(Kohli)。我看到你已经编辑了你的问题,让我再看一看。嗨,萨米,我已经修改了查询,只选择了第一个球员已经做了一个世纪的场地。这将按预期返回玩家2和玩家6。这个查询不会检查其他玩家是否也在该场地上打了一个世纪,只要他们在那里打过球。如果您想检查他们是否也在那里度过了一个世纪,请将
和m.score>=100
添加到
加入
条件中。