Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从mysql中选择记录的sql查询_Mysql_Sql - Fatal编程技术网

从mysql中选择记录的sql查询

从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

你能告诉我从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
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)