从MySQL联接的第一个表获取所有结果

rob*_*ins 1 php mysql

我有两张桌子。我需要从第一张表中选择所有行(仅一个条件hotel_id = 2),并从第二张表中选择所有行(基于条件)。但是我使用的左联接仅从第二张表中获取数据。

询问

 SELECT R.name room_name,
        R.id room_id,
        UD.discount 
   FROM user_discounts UD 
   LEFT 
   JOIN rooms R 
     ON R.id = UD.room_id
  WHERE UD.user_id = 1482
    AND UD.hotel_id = 2
Run Code Online (Sandbox Code Playgroud)

我需要显示所有房间,但现在在两个表中显示公共房间。

Use*_*ady 5

如果要所有房间,请反转表关系

SELECT `R`.`name` as `room_name`, `R`.`id` as `room_id`, `UD`.`discount` as `discount`
FROM  `rooms` as `R`
LEFT JOIN `user_discounts` as `UD` ON `R`.`id`= `UD`.`room_id`
             AND`UD`.`user_id` = '1482'
             AND `UD`.`hotel_id` = '2'
Run Code Online (Sandbox Code Playgroud)

但是,您还需要更改where子句。它们可以代替您的原始where子句用作连接条件的一部分。

可以很容易地忽略where子句的影响,但是,如果您在where子句中引用左连接表,则还必须允许该表中的数据为NULL。例如

SELECT `R`.`name` as `room_name`, `R`.`id` as `room_id`, `UD`.`discount` as `discount`
FROM  `rooms` as `R`
LEFT JOIN `user_discounts` as `UD` ON `R`.`id`= `UD`.`room_id`
WHERE (`UD`.`user_id` = '1482'
   AND `UD`.`hotel_id` = '2'
      )
   OR `UD`.`room_id` IS NULL
Run Code Online (Sandbox Code Playgroud)

如果餐桌房间有hotel_id,则:

SELECT `R`.`name` as `room_name`, `R`.`id` as `room_id`, `UD`.`discount` as `discount`
FROM  `rooms` as `R`
LEFT JOIN `user_discounts` as `UD` ON `R`.`id`= `UD`.`room_id`
             AND`UD`.`user_id` = '1482'
             AND `UD`.`hotel_id` = `R`.`hotel_id`
WHERE `R`.`hotel_id` = 2
Run Code Online (Sandbox Code Playgroud)