Mysql 陷入sql子查询
我有三张桌子:Mysql 陷入sql子查询,mysql,sql,subquery,Mysql,Sql,Subquery,我有三张桌子: 1) Sailors (sid:INT, sname:VARCHAR(30), rating:INT, age:INT) 2) Boats (bid:INT, bname:VARCHAR(30), color:VARCHAR(10)) 3) Reserves (bid:INT, sid:INT, day:DATE) 我想写一个查询,显示所有水手至少保留一次的每艘船的编号/ 到目前为止,我写了以下内容: SELECT b.bid, b.bname FROM boats as b
1) Sailors (sid:INT, sname:VARCHAR(30), rating:INT, age:INT)
2) Boats (bid:INT, bname:VARCHAR(30), color:VARCHAR(10))
3) Reserves (bid:INT, sid:INT, day:DATE)
我想写一个查询,显示所有水手至少保留一次的每艘船的编号/
到目前为止,我写了以下内容:
SELECT b.bid, b.bname
FROM boats as b , sailors as s , reserves as r
WHERE r.bid = b.bid and r.sid = s.sid
GROUP BY r.bid
HAVING count(r.sid) = count(s.sid)
对我来说,这似乎是正确的答案,但在MYSQL上尝试后,id没有起作用。你有没有尝试过将船只储备数量与这样的水手数量进行比较
HAVING count(r.sid) = (Select count(sid) from sailors)
您还需要确保countr.sid是唯一的bid计数,如果同一个水手多次预订同一条船,那么sid是唯一的bid计数
SELECT g.bid,
g.name
FROM
(SELECT b.bid, b.name, s.sid
FROM boats AS b, reserves AS r, sailors AS s
WHERE b.bid = r.bid AND r.sid = s.sid
GROUP BY b.bid, b.name, s.sid
) AS g
GROUP BY g.bid, g.name
HAVING COUNT(g.bid) = (SELECT COUNT(s.SID) FROM sailors AS s)
有几种查询模式将返回指定的结果 假设Reserves表中的sid列是引用sealSSID的外键,我们可以使用给定船只Reserves表中的不同sid计数,并将其与sealers的不同sid计数进行比较 例如:
SELECT b.bid
, b.bname
FROM Boats b
JOIN ( SELECT rr.bid
, COUNT(DISTINCT rr.sid) AS cnt
FROM Reserves rr
GROUP BY rr.bid
) r
ON r.bid = b.bid
JOIN ( SELECT COUNT(DISTINCT ss.sid) AS cnt
FROM Sailors ss
) s
ON s.cnt = r.cnt
别名为r的内联视图从Reserves表中为每艘船获取不同sid值的计数
别名为s的内联视图为我们提供了来自sealers的不同sid值的计数。如果sid是水手的主键或唯一键(这是我们所期望的),那么我们可以忽略DISTINCT关键字。这个问题没有说明是否是这样,因此我们没有做出错误的假设,而是编写了一个查询,它将在更一般的情况下工作
此查询假定存在外键约束。。。储备中的行不会有一个非空值,该值不会引用水手中的行。如果不是这样的话,我们可以修改内联视图查询r,以便获得sealers表中显示的sid值的不同计数
这可以替换上面的内联视图查询r:
这种查询模式可以很容易地适应于检查除所有海员之外的其他条件
还有其他一些查询模式可以实现相同的结果。您可以查看以下内容:
===============================================
CREATE TABLE Sailors (sid INT, sname VARCHAR(30), rating INT, age INT)
INSERT INTO Sailors values (1,'S1',100,20);
INSERT INTO Sailors values (2,'S2',100,20);
INSERT INTO Sailors values (3,'S3',100,20);
INSERT INTO Sailors values (4,'S4',100,20);
INSERT INTO Sailors values (5,'S5',100,20);
CREATE TABLE Boats (bid INT, bname VARCHAR(30), color VARCHAR(10))
INSERT INTO Boats values (1,'B1','Blue');
INSERT INTO Boats values (2,'B2','Red');
INSERT INTO Boats values (3,'B3','Green');
INSERT INTO Boats values (4,'B4','Blue');
INSERT INTO Boats values (5,'B5','Green');
CREATE TABLE Reserves (bid INT, sid INT, day DATE)
INSERT INTO Reserves values (1,1,'2015-01-01');
INSERT INTO Reserves values (1,2,'2015-01-01');
INSERT INTO Reserves values (1,3,'2015-01-01');
INSERT INTO Reserves values (1,4,'2015-01-01');
INSERT INTO Reserves values (1,5,'2015-01-01');
INSERT INTO Reserves values (2,1,'2015-01-01');
INSERT INTO Reserves values (2,2,'2015-01-01');
INSERT INTO Reserves values (2,3,'2015-01-01');
INSERT INTO Reserves values (2,4,'2015-01-01');
INSERT INTO Reserves values (2,5,'2015-01-01');
INSERT INTO Reserves values (2,3,'2015-01-02');
INSERT INTO Reserves values (2,4,'2015-01-03');
INSERT INTO Reserves values (2,5,'2015-01-04');
INSERT INTO Reserves values (3,1,'2015-01-02');
INSERT INTO Reserves values (4,1,'2015-01-03');
INSERT INTO Reserves values (5,1,'2015-01-04');
===============================================
SELECT Reserves.bid , Boats.bname FROM Reserves , Boats
WHERE Reserves.bid = Boats.bid
GROUP BY Reserves.bid , Boats.bname
HAVING COUNT (DISTINCT Reserves.sid) = (SELECT COUNT(sid) FROM Sailors)
Result ===>
BID BNAME
---------------
1 B1
2 B2
希望能有所帮助:这些表之间是否存在某种关联?谁对这件事投了赞成票?有人愿意解释一下这个答案值得投反对票的原因吗?
===============================================
CREATE TABLE Sailors (sid INT, sname VARCHAR(30), rating INT, age INT)
INSERT INTO Sailors values (1,'S1',100,20);
INSERT INTO Sailors values (2,'S2',100,20);
INSERT INTO Sailors values (3,'S3',100,20);
INSERT INTO Sailors values (4,'S4',100,20);
INSERT INTO Sailors values (5,'S5',100,20);
CREATE TABLE Boats (bid INT, bname VARCHAR(30), color VARCHAR(10))
INSERT INTO Boats values (1,'B1','Blue');
INSERT INTO Boats values (2,'B2','Red');
INSERT INTO Boats values (3,'B3','Green');
INSERT INTO Boats values (4,'B4','Blue');
INSERT INTO Boats values (5,'B5','Green');
CREATE TABLE Reserves (bid INT, sid INT, day DATE)
INSERT INTO Reserves values (1,1,'2015-01-01');
INSERT INTO Reserves values (1,2,'2015-01-01');
INSERT INTO Reserves values (1,3,'2015-01-01');
INSERT INTO Reserves values (1,4,'2015-01-01');
INSERT INTO Reserves values (1,5,'2015-01-01');
INSERT INTO Reserves values (2,1,'2015-01-01');
INSERT INTO Reserves values (2,2,'2015-01-01');
INSERT INTO Reserves values (2,3,'2015-01-01');
INSERT INTO Reserves values (2,4,'2015-01-01');
INSERT INTO Reserves values (2,5,'2015-01-01');
INSERT INTO Reserves values (2,3,'2015-01-02');
INSERT INTO Reserves values (2,4,'2015-01-03');
INSERT INTO Reserves values (2,5,'2015-01-04');
INSERT INTO Reserves values (3,1,'2015-01-02');
INSERT INTO Reserves values (4,1,'2015-01-03');
INSERT INTO Reserves values (5,1,'2015-01-04');
===============================================
SELECT Reserves.bid , Boats.bname FROM Reserves , Boats
WHERE Reserves.bid = Boats.bid
GROUP BY Reserves.bid , Boats.bname
HAVING COUNT (DISTINCT Reserves.sid) = (SELECT COUNT(sid) FROM Sailors)
Result ===>
BID BNAME
---------------
1 B1
2 B2