【问题标题】:How to get ONLY NULL values from table MySQL如何从表 MySQL 中仅获取 NULL 值
【发布时间】:2019-12-03 08:22:25
【问题描述】:

我已经深入搜索了论坛,但我没有看到这个具体案例的答案。 考虑这个数据模型:

我只想获取所有房间都没有花的建筑物名称(其中 Flower.Name = null)。

如果我有例子

建筑 1. 房间 1. 花 1

1号楼。1号房间。没有花(空)

建筑 2. 房间 1. 花 1

建筑 2. 房间 2. 花 2

3 号楼。1 号房间。没有花(空)

3号楼。2号房间。没有花(空)

我希望只看到 Building 3 的结果。

我问了这个问题:

SELECT Building.Name, Room.Name, Flower.Name FROM Building 
JOIN Room ON Building.BuildingID = Room.BuildingID 
JOIN Flower ON Room.RoomID = Flower.RoomID 
WHERE Flower.Name IS NULL;

但它也列出了 1 号楼作为结果,因为 1 号楼有一个没有花的房间。而我想看到的只是所有房间都没有花的建筑物。

谁能给我一个提示?我在 MAMP 上使用 MySQL。

=================================== 编辑:

CREATE TABLE Building( 
BuildingID int NOT NULL AUTO_INCREMENT, 
Name varchar(20), 
CONSTRAINT BuildingID_PK PRIMARY KEY(BuildingID));

CREATE TABLE Room(
RoomID int NOT NULL AUTO_INCREMENT,
BuildingID int,
Name varchar(20),
CONSTRAINT RoomID_PK PRIMARY KEY(RoomID),
CONSTRAINT BuildingID_FK FOREIGN KEY (BuildingID) REFERENCES Building(BuildingID));

CREATE TABLE Flower(
FlowerID int NOT NULL AUTO_INCREMENT,
RoomID int,
Name varchar(20),
CONSTRAINT FlowerID_PK PRIMARY KEY(FlowerID),
CONSTRAINT RoomID_FK FOREIGN KEY (RoomID) REFERENCES Room(RoomID));

-- Now data:

INSERT INTO Building (Name) VALUES ("Building 1");
INSERT INTO Building (Name) VALUES ("Building 2");
INSERT INTO Building (Name) VALUES ("Building 3");

INSERT INTO Room(BuildingID, Name) VALUES (1, "Room1");
INSERT INTO Room(BuildingID, Name) VALUES (1, "Room2");
INSERT INTO Room(BuildingID, Name) VALUES (2, "Room1");
INSERT INTO Room(BuildingID, Name) VALUES (2, "Room2");
INSERT INTO Room(BuildingID, Name) VALUES (3, "Room1");
INSERT INTO Room(BuildingID, Name) VALUES (3, "Room2");

INSERT INTO Flower(RoomID, Name) VALUES (1, "Flower 1");
INSERT INTO Flower(RoomID, Name) VALUES (2, null);
INSERT INTO Flower(RoomID, Name) VALUES (3, "Flower 1");
INSERT INTO Flower(RoomID, Name) VALUES (4, "Flower 2");
INSERT INTO Flower(RoomID, Name) VALUES (5, null);
INSERT INTO Flower(RoomID, Name) VALUES (6, null);

我希望这张表只列出 3 号楼:

SELECT Building.Name, Room.Name, Flower.Name FROM Building JOIN Room ON Building.BuildingID = Room.BuildingID JOIN Flower ON Room.RoomID = Flower.RoomID WHERE Flower.Name IS NULL;

姓名姓名姓名

1 号楼 Room2 空

3 号楼 Room1 NULL

3 号楼 Room2 空

【问题讨论】:

  • 向我们展示一些示例表数据和预期结果。 (作为格式化文本,没有图像。)另请阅读minimal reproducible example

标签: mysql sql database


【解决方案1】:

这是一个可能的查询:

SELECT Name
FROM Building
WHERE NOT EXISTS
  (SELECT *
   FROM Room JOIN Flower ON Flower.RoomID = Room.RoomID
   WHERE Room.BuildingID = Building.BuildingID
         AND Flower.Name IS NOT NULL);

查询查找所有建筑物,其中没有房间存在且花朵不为空。

这里是fiddle

请注意,表示这种情况的更常用方法是在表 Flowers 中仅包含与带有鲜花的房间相对应的行。这样查询写起来就更简单了。

【讨论】:

    【解决方案2】:

    你试试这个:

    SELECT Building.Name, Room.Name, Flower.Name 
    FROM Building 
    INNER JOIN Room ON Building.BuildingID = Room.BuildingID 
    LEFT JOIN Flower ON Room.RoomID = Flower.RoomID 
    WHERE Flower.Name IS NULL
    

    【讨论】:

    • 答案中仍然显示 Building 1。我只想看 3 号楼。
    【解决方案3】:

    在花上使用left join 而不是inner join

    select b.Name, r.Name, f.Name 
    from Building b
    inner join Room r on r.BuildingID = b.BuildingID
    left join Flower f on r.RoomID = f.RoomID
    where coalesce(f.Name, '') = ''
    

    【讨论】:

    • 我仍然得到 Building 1. Room 2 结果:(
    【解决方案4】:

    Left Join 将是解决方案,而不是 Inner Join

    SELECT b.Name, r.Name, f.Name 
    FROM Building b
    INNER JOIN Room r ON r.BuildingID = b.BuildingID
    LEFT JOIN Flower f ON r.RoomID = f.RoomID
    WHERE f.Name IS NULL;
    

    【讨论】:

    • 我仍然得到 Building 1. Room 2 结果。
    【解决方案5】:

    试着写SELECT Building.Name, Room.Name, Flower.Name from flower inner join (building inner join room) where BuildingId = room.BuildingId AND (room.RoomId = flower.RoomId AND flower.Name = '');

    【讨论】:

    • 结果我得到了空集。
    • 尝试更改变量名称,因为太混乱了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 2018-04-27
    • 1970-01-01
    • 2014-03-11
    相关资源
    最近更新 更多