Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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案例加入查询帮助_Mysql_Database - Fatal编程技术网

Mysql案例加入查询帮助

Mysql案例加入查询帮助,mysql,database,Mysql,Database,我正在尝试创建一个查询,它获取所有列和一个表示可用性的case列,但是我需要在混合中包含一对多关系,这会让我的头脑混乱 不带关系的我的查询: SELECT storage_rooms.*, CASE WHEN release_date <= CURDATE() THEN 1 WHEN release_date <= ADDDATE(CURDATE(), INTERVAL 30 DAY) THEN release_date ELS

我正在尝试创建一个查询,它获取所有列和一个表示可用性的case列,但是我需要在混合中包含一对多关系,这会让我的头脑混乱

不带关系的我的查询:

SELECT storage_rooms.*,
    CASE
        WHEN release_date <= CURDATE() THEN 1
        WHEN release_date <= ADDDATE(CURDATE(), INTERVAL 30 DAY) THEN release_date
        ELSE 0 
    END AS available
FROM storage_rooms
选择储藏室。*,
案例

当发布日期时,我不完全确定它是否有效,但您可以尝试以下方法:

SELECT storage_rooms.*,
    CASE
        WHEN release_date <= CURDATE() OR availibility.order_status_id IN (3, 4) THEN 1
        WHEN release_date <= ADDDATE(CURDATE(), INTERVAL 30 DAY) THEN release_date
        ELSE 0 
    END AS available
FROM storage_rooms
LEFT JOIN 
    ( SELECT id AS order_id, status_id AS order_status_id, storage_room_id AS order_storage_room_id
          FROM orders WHERE status_id IN (3, 4)
          GROUP BY storage_room_id
    ) availibility
    ON (storage_rooms.id = availibility.order_storage_room_id)

您能否更精确地解释“不工作”:是否存在SQL错误?如果没有,结果是什么?它们与您期望的结果有何不同?我得到一个“子查询返回超过1行”,我想这在没有分组依据的情况下是有意义的。如果订单上的状态id为3或4,我需要它使“可用”列“1”。老实说,我甚至不认为我接近实际的解决方案。这是一个datatable.js表的查询,所以我需要所有的存储室,这样我就可以利用搜索和排序等。@DerpyMongoose好的,我看得更清楚你想要什么,我编辑了答案:
LEFT JOIN
将添加所有
订单
数据以及来自
storage\u rooms
的数据,当id对应时,您现在应该能够使用
订单。在
案例中,status\u id
我仍然需要根据storage\u rooms.id在我认为的某个地方进行分组。我得到的每个订单都是重复的。@DerpyMongoose你是对的,现在应该更好了,如果它起作用,我会用一些细节更新答案。如果我根据你的答案找到了正确的查询,我现在意识到这比我想象的要复杂得多,我没有提供足够的信息来得到一个完美的答案。
SELECT storage_rooms.*,
    CASE
        WHEN release_date <= CURDATE() OR availibility.order_status_id IN (3, 4) THEN 1
        WHEN release_date <= ADDDATE(CURDATE(), INTERVAL 30 DAY) THEN release_date
        ELSE 0 
    END AS available
FROM storage_rooms
LEFT JOIN 
    ( SELECT id AS order_id, status_id AS order_status_id, storage_room_id AS order_storage_room_id
          FROM orders WHERE status_id IN (3, 4)
          GROUP BY storage_room_id
    ) availibility
    ON (storage_rooms.id = availibility.order_storage_room_id)
SELECT storage_rooms.*,
    CASE
        WHEN release_date <= CURDATE() OR aggregate.order_status_id IS NULL THEN 1
        WHEN release_date <= ADDDATE(CURDATE(), INTERVAL 30 DAY) THEN release_date
        ELSE 0
    END AS available
FROM storage_rooms
LEFT JOIN
    (SELECT storage_room_id, order_status_id
        FROM orders WHERE order_status_id IN (1, 2)
        GROUP BY storage_room_id, order_status_id
    ) aggregate
    ON storage_rooms.id = aggregate.storage_room_id