【问题标题】:sql query to select records from mysqlsql查询从mysql中选择记录
【发布时间】:2019-06-02 15:40:01
【问题描述】:

可以建议我从 MySQL 中选择记录的最佳方法

customer
--------
id  bed_id  status
1   1       vocated     
2   1       booked
3   2       vocated

bed
-----
id  name
1   lower 
2   middle
3   upper

我需要选择空置或未分配的床位

在这里,预期的结果是 空床应该是:bed_id's = 2 and 3 获得这种结果的最佳 SQL 查询是什么

【问题讨论】:

  • 定义“最佳”!!向我们展示您的尝试
  • 你对子查询有什么看法?

标签: mysql sql


【解决方案1】:

加入表格并按床的ID分组,并将条件放在HAVING子句中:

select b.id, b.name
from bed b left join customer c
on c.bed_id = b.id
group by b.id
having (
  sum(status = 'vacated') > 0
  and
  sum(status = 'booked') = 0
) or sum(status is null) > 0

我不确定条件中是否需要and 或or

【讨论】:

  • 此查询将 1 和 2 作为“床号”
  • 现在给出 2 和 3
  • 好吧,改变之后:)
  • 谢谢@forpas。我期望在单个连接查询中得到相同的结果
  • 这是一个单一的连接,但它会在之后进行分组并聚合以检查条件。
【解决方案2】:

试试这个-

SELECT * FROM bed
WHERE ID NOT IN (
    SELECT DISTINCT bed_id FROM customer
    WHERE Status = 'booked'
)

注意:这将适用于您当前的数据。但如果我认为可行,您需要在客户表中检查 BED 的最新状态。在这种情况下,您需要为您的需求提供更多种类和更多解释的数据。

【讨论】:

  • 谢谢。寻找一个加入表的查询,而不是一个子查询。
  • 客户表中的 ID 是增量的?对于 BED_id 1,有 2 个 ID 为 1 和 2 的条目。是否最大 ID 2 保持 Bed_id = 1 的最新状态
【解决方案3】:

您可以通过not exists 应用反向逻辑:

select *
  from bed b
 where not exists 
  (
   select bed_id
     from customer
    where status != 'vocated' and status = 'booked'
      and bed_id = b.id);

Demo

【讨论】:

    【解决方案4】:

    您可以使用相关子查询和左连接来查找最近的状态,以查找从未有过活动的房间

     select group_concat(s.t1id) availablerooms 
        from
        (
        select t1.id t1id,t1.name,t.id,t.bed_id,t.status
        from t1
        left join t on t1.id = t.bed_id 
        where t.id = (select max(id) from t where t1.id = t.bed_id) or
                t.id is null
        ) s
        where s.status <> 'booked' or s.status is null;
    
    +----------------+
    | availablerooms |
    +----------------+
    | 2,3            |
    +----------------+
    1 row in set (0.00 sec)
    

    【讨论】:

      猜你喜欢
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 2019-02-28
      • 2019-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多