mysql - 按照 MySQL 中的条件顺序左连接到单行

标签 mysql sql

好的,我试图通过抽象出细节来简化我的问题,但恐怕我不清楚并且不符合主持人的要求。因此,我将更详细地发布包含我的问题的完整查询以及我正在努力解决的实际查询。如果问题仍然不充分,请您对不清楚的地方进行具体评论,我会尽力澄清。

首先,这是返回每个床的所有分配行的当前查询:

SELECT 
  beds.bed_id,
  beds.bedstatus,
  beds.position as bed_position,
  rooms.room_id,
  rooms.room,
  wings.wing_id,
  wings.name as wing_name,
  buildings.building_id,
  buildings.name as building_name,
  assignments.assignment_id,
  assignments.student_id,
  assignments.assign_dt,
  assignments.assigned_by,
  assignments.assignment_status,
  assignments.expected_arrival_dt as arrival_dt,
  assignments.room_charge_type,
  students.first_name,
  students.last_name,
  meal_plans.name as meal_plan_name,
  room_rates.rate_name
FROM
  beds
LEFT JOIN 
  rooms ON (beds.room_id = rooms.room_id)
LEFT JOIN
  wings ON (rooms.wing_id = wings.wing_id)
LEFT JOIN
  buildings ON (wings.building_id = buildings.buildings_id)
LEFT JOIN assignments ON 
  ((beds.bed_id=assignments.bed_id) AND (term_id = @term_id))
LEFT JOIN
  students ON (assignments.student_id = students.student_id)
LEFT JOIN
  meal_plans ON (assignments.meal_plan_id = meal_plans.meal_plan_id)
LEFT JOIN
  room_rates ON (room_rate_id = room_rates.room_rate_id)
WHERE
  (
    (rooms.room IS NOT NULL) AND
    (rooms.assignable = 1) AND
    (buildings.active = 1) AND
    (buildings.building_id = @building_id)
  )
ORDER BY BY rooms.room;

问题是,“assignments”表中可能有多个行,每个房间由“assignment_status”字段区分,我希望每个分配只有一行。我想根据 assignment_status 中的值来确定要选择哪个分配行。也就是说,如果分配状态为“事件”,我想要那一行,否则,如果有一行状态为“等待批准”,那么我想要那一行,等等......

这里给出了 Barmar 的建议:

LEFT JOIN (SELECT *
       FROM OtherTable
       WHERE <criteria>
       ORDER BY CASE status
                    WHEN 'Active' THEN 1
                    WHEN 'Waiting Approval' THEN 2
                    WHEN 'Canceled' THEN 3
                    ...
                END
       LIMIT 1) other

这非常有帮助,我尝试了这种方法:

SELECT 
  beds.bed_id,
  beds.bedstatus,
  beds.position as bed_position,
  rooms.room_id,
  rooms.room,
  wings.wing_id,
  wings.name as wing_name,
  buildings.building_id,
  buildings.name as building_name,
  assign.assignment_id,
  assign.student_id,
  assign.assign_dt,
  assign.assigned_by,
  assign.assignment_status,
  assign.expected_arrival_dt as arrival_dt,
  assign.room_charge_type,
  students.first_name,
  students.last_name,
  meal_plans.name as meal_plan_name,
  room_rates.rate_name
FROM
  beds
LEFT JOIN 
  rooms ON (beds.room_id = rooms.room_id)
LEFT JOIN
  wings ON (rooms.wing_id = wings.wing_id)
LEFT JOIN
  buildings ON (wings.building_id = buildings.buildings_id)

LEFT JOIN (SELECT *
           FROM assignments
           WHERE ((assignments.bed_id==beds.bed_id) AND (term_id = @term_id))
           ORDER BY CASE assignment_status
                        WHEN 'Active' THEN 1
                        WHEN 'Waiting Approval' THEN 2
                        WHEN 'Canceled' THEN 3
                    END
           LIMIT 1) assign  

LEFT JOIN
  students ON (assign.student_id = students.student_id)
LEFT JOIN
  meal_plans ON (assign.meal_plan_id = meal_plans.meal_plan_id)
LEFT JOIN
  room_rates ON (room_rate_id = room_rates.room_rate_id)
WHERE
  (
    (rooms.room IS NOT NULL) AND
    (rooms.assignable = 1) AND
    (buildings.active = 1) AND
    (buildings.building_id = @building_id)
  )
ORDER BY rooms.room;

但我意识到,这里的问题是 OtherTable(分配)基于 FK 连接到父查询:

  ((beds.bed_id=assignments.bed_id) AND (term_id = @term_id))

所以我无法执行子选择,因为 beds.bed_id 不在子选择的范围内。因此,正如 Barmar 的评论表明连接标准需要在子选择之外——但我无法弄清楚如何将结果限制为每个房间的一行并将连接移动到子选择之外。我想知道 travelboy 使用 GROUP BY 的建议是否更有成效,但无法确定应该如何进行分组。

如果我可以提供更多说明,请告诉我。

原始问题:

我需要从表 A 对另一个表中的单行执行左连接,表 B 满足特定条件(表 B 中可能有多个或没有满足条件的行)。如果有多行我想根据表B中某个字段的值来选择B中的哪一行加入。例如,如果B中有一行状态列为'Active',我想要该行,如果不,如果有一行 status='Waiting Approval',我想要那一行,如果有一行 status='Canceled',我想要那一行,等等......我可以在没有子选择的情况下这样做吗?使用子选择?

最佳答案

使用:

LEFT JOIN (SELECT *
           FROM OtherTable
           WHERE <criteria>
           ORDER BY CASE status
                        WHEN 'Active' THEN 1
                        WHEN 'Waiting Approval' THEN 2
                        WHEN 'Canceled' THEN 3
                        ...
                    END
           LIMIT 1) other

关于mysql - 按照 MySQL 中的条件顺序左连接到单行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19350412/

相关文章:

mysql - 查找最大匹配行并在 mysql 中对其进行计数

php - 为什么我的 MySQL 程序无法运行

php - 仅获取第一行 AUTO_INCRMENT 列值 - Codeigniter

android - 我如何处理SQLiteConstraintException错误代码19?

sql - 如何将两个查询结果合二为一,我有不同的列名

sql - 如何将 .bak 文件导入 Microsoft SQL Server 2012?

sql - 删除时触发以避免悬空引用

php - 如何为 "mac"设置读取文件权限,类似于 PC 的右键单击

php - 在 URL 中使用带有多个参数的 $_GET

Mysql添加约束: force a field to get specific values