从mysql中选择记录的sql查询
你能告诉我从MySQL中选择记录的最佳方法吗从mysql中选择记录的sql查询,mysql,sql,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 我需要选择空出或未分配的床 在这里,预期的结果是 空床应为:床号=2和3 获取这种结果的最佳SQL查询是什么- SELECT * FROM bed
customer
--------
id bed_id status
1 1 vocated
2 1 booked
3 2 vocated
bed
-----
id name
1 lower
2 middle
3 upper
我需要选择空出或未分配的床
在这里,预期的结果是
空床应为:床号=2和3
获取这种结果的最佳SQL查询是什么-
SELECT * FROM bed
WHERE ID NOT IN (
SELECT DISTINCT bed_id FROM customer
WHERE Status = 'booked'
)
注意:此wll适用于您当前的数据。但是如果我认为可行的话,您需要在客户表中检查床位的最新状态。在这种情况下,您需要提供更多种类的数据,并对您的需求进行更多解释。根据床的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
我不确定您是否需要和/或在条件下,您可以通过不存在应用反向逻辑:
您可以使用相关子查询和左连接查找最近的状态,以查找从未有过活动的房间
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)
非常感谢。正在查找连接表而不是子查询的查询。customer表中的Id是增量的吗?对于id为1的床,有2个id为1和2的条目。Bigest ID 2的最新状态为Bed_ID=1定义为“best”!!让我们看看你在子查询中做了哪些尝试?这个查询将1和2作为bed id,现在它将2和3作为bed id。修改后:谢谢@forpas。我在单连接查询中也希望如此。这是一个单连接,但它会在之后进行分组和聚合以检查条件。
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)