Mysql案例加入查询帮助
我正在尝试创建一个查询,它获取所有列和一个表示可用性的case列,但是我需要在混合中包含一对多关系,这会让我的头脑混乱 不带关系的我的查询: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
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