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