sql查询从mysql中选择记录

时间:2019-06-02 06:54:30

标签: mysql sql

可以建议我从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和3 什么是最好的SQL查询来获得这种结果

4 个答案:

答案 0 :(得分: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

我不确定您是否需要在条件中使用andor

答案 1 :(得分:0)

试试这个-

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

注意:此功能适用于您当前的数据。但是,如果我认为可行,则需要在客户表中检查BED的最新状态。在这种情况下,您需要提供更多种类的数据,并更多地说明您的要求。

答案 2 :(得分:0)

您可以通过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

答案 3 :(得分:0)

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

 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)