我对3张桌子,结算,订单和乘客有疑问。 和解有订单,订单有乘客。
TABLE: Settlemnt
id
TABLE: Order
id settlement_id
TABLE: passenger
id orders_id
如果结算没有订单(然后没有乘客),它什么都不返回。 我想要的是,即使它没有订单,也要返回空的结算。 计数(乘客)为我遗弃它并且如果空的话则不返回结算。 这是简化的查询:
select s.id, o.id, count(distinct p.id)
from settlement s
left join orders o ON o.settlement_id = s.id
left join passenger p on p.orders_id = o.id
where s.date = '2016-02-02';
group by o.id
如何在没有订单的情况下退回结算?
答案 0 :(得分:0)
适合我...
SELECT s.id s_id
, o.id o_id
, p.id p_id
FROM settlement s
LEFT
JOIN orders o
ON o.sid = s.id
LEFT
JOIN passengers p
ON p.oid = o.id;
+------+------+------+
| s_id | o_id | p_id |
+------+------+------+
| 1 | NULL | NULL |
| 2 | 1 | 1 |
+------+------+------+
答案 1 :(得分:0)
您的查询的主要问题似乎是您通过o.id进行GROUP BY。任何没有订单的结算将具有NULL的o.id,因此所有没有订单的结算将被合并为一行。为此o.id返回的s.id未定义(并且实际上是随机的)。
将其更改为GROUP BY s.id和o.id
SELECT s.id,
o.id,
COUNT(DISTINCT p.id)
FROM settlement s
LEFT JOIN orders o ON o.settlement_id = s.id
LEFT JOIN passenger p ON p.orders_id = o.id
WHERE s.date = '2016-02-02';
GROUP BY s.id,
o.id