【问题标题】:Sequel to get select EVERY input续集选择每个输入
【发布时间】:2016-05-12 05:14:52
【问题描述】:

我已经创建了三个表

CREATE TABLE guest(

name varchar(100),
ranking int,
PRIMARY KEY (name)
);

CREATE TABLE room(

 roomname varchar(100),
 wallcolor varchar(100),
 rating int,
 PRIMARY KEY(roomnane)
 );

 CREATE TABLE reservation(

 name varchar(100),
 roomname varchar(100),
 day varchar(100),
 moveinday int,
 moveoutday int,
 PRIMARY KEY(roomname, day, start, finish),
  FOREIGN KEY(roomname) REFERENCES room(roomname),
  FOREIGN KEY(name) REFERENCES guest(name)
 );

我正在尝试编写查询以查找预订每个“LakeView”房间的客人

我尝试了以下

SELECT g.name
FROM guest g, reservation r, room rr
WHERE rr.name = g.name
AND rr.roomname = "LakeView"
GROUP BY g.name

这似乎没有列出每个房间。我怎么能解决这个问题?

输入:

  insert into guest values ('Andrew', 1);
  insert into guest values ('Jack', 4);
  insert into guest values ('Jake', 4);
  insert into room values ('LakeView', 'white', 10);
  insert into room values ('BayView', 'blue', 4);
  insert into reservation values ('Andrew', 'LakeView', 'Friday', 10,15);
  insert into reservation values ('Jake', 'LakeView', 'Monday', 10,16);
  insert into reservation values ('Jack', ' BayView', 'Tuesday', 11,15);

想要的输出是

   Andrew 
   Jake

【问题讨论】:

  • 你能提供一些输入输出吗?
  • 这个词的真正含义是什么谁预订了每艘“湖景”船
  • 那是一个错字。检查样本输入和预期输出的编辑
  • 看起来可能是错误的WHERE rr.name = g.name。您正在将房间名称与客人姓名匹配。
  • 如果roomname 是主键,怎么会有多个呢?这意味着它必须是独一无二的。

标签: mysql sql


【解决方案1】:

试试这个:

解决方案 1:

SELECT 
guest.name
FROM guest INNER JOIN 
reservation ON reservation.name = guest.name
INNER JOIN room ON reservation.roomname = room.roomname
WHERE reservation.roomname = "LakeView"
GROUP BY guest.name

我在这里强调了你的错误:

  • 您尝试将 rr.name 与 g.name 匹配。这意味着你是 将房间名与您不想要的客人姓名相匹配(到目前为止,我 猜)。
  • 另一个错误是您只在房间内查看“LakeView” 表条目。所以其他没有预订湖景房间的客人 可能会出现在最终结果集中。您还需要过滤那些 预订表中具有 LakeView 房间名称的记录。

以下是根据上述观察修改您的查询:

解决方案 2:

SELECT g.name
FROM guest g, reservation r, room rr
WHERE r.name = g.name
AND rr.roomname = "LakeView"
AND r.roomname = "LakeView"
GROUP BY g.name;

N:B: 鼓励使用解决方案 1。尽量避免解决方案 2 中所述的隐式连接。

我个人认为 INNER JOIN 更好,因为它更 可读。它更好地显示了表之间的关系。你得到了 连接中的那些关系,然后您在 WHERE 中进行过滤 条款。这种分离使查询更具可读性。

看看这个post

【讨论】:

  • 请不要鼓励用户使用隐式连接。在答案中使用 ANSI JOIN ... ON 语法。
  • 你是对的@Barmar。但我只是想以他接近的方式帮助他。稍后我可以添加有关使用 ANSI JOIN....ON 构建查询的建议。谢谢。
  • 这似乎只返回 1 位预订的客人。我想知道每一位预订湖景房的客人
  • 检查您的客人餐桌是否存在 Jake
  • 在您的示例输入中没有 Jake 的条目。
【解决方案2】:

我假设预订表中的“姓名”列是客人的姓名。如果这是真的,听起来您只需要保留表来进行此查询,但如果您想将它们全部组合起来:

select rv.name as Guest from room as r left join reservation as rv on rv.roomname = r.roomname left join guest as g on g.name = rv.name where rv.roomname = 'LakeView'

【讨论】:

    【解决方案3】:

    如果你使用 php-mysql 会有帮助

    $qry=mysql_query("select name from reservation where roomname='LakeView'");
    while($result=mysql_fetch_array($qry)
    {
      echo $result['name'];
     }
    

    【讨论】:

    • PHP 与此有什么关系?无论使用什么语言,查询都是一样的。而且你不应该使用过时的mysql 扩展,使用mysqliPDO
    猜你喜欢
    • 2010-12-17
    • 2018-07-11
    • 2017-01-13
    • 1970-01-01
    • 2011-12-28
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多