可以建议我从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查询来获得这种结果
答案 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
我不确定您是否需要在条件中使用and
或or
答案 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);
答案 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)