MySQL 查询 CASE 或 JOIN 或 UNION - 使用哪个?
MySQL query CASE or JOIN or UNION - which to use?
我有 table 个订单和子订单。以及包含产品行的视图。我想 SELECT
所有带有 status = 2
的行,但是如果两者(子订单和主订单)都有 status = 2
,我想要那个而不是子订单 id 有主订单的 id。
这是我的例子 table:
| id | suborder | mainorder | status |
|--------|----------|-----------|--------|
| 000001 | (NULL) | (NULL) | 3 |
| 000002 | (NULL) | (NULL) | 2 |
| 000003 | 1 | 000001 | 2 |
| 000004 | 1 | 000002 | 2 |
所以查询结果为:
| id | suborder | mainorder | status |
|--------|----------|-----------|--------|
| 000002 | (NULL) | (NULL) | 2 |
| 000003 | 1 | 000001 | 2 |
| 000002 | 1 | 000002 | 2 |
所以最后一个 id 改变的原因是 mainorder 有 status = 2
。订单 ID 000003
没有变化,因为订单 000001
没有 status = 2
.
我试过这个查询,但我不知道如何包含状态..
SELECT
CASE
WHEN mainorder IS NULL THEN
id
WHEN mainorder IS NOT NULL THEN
mainorder
END AS final_id,
orders.*
FROM
orders
WHERE
`status` = 2
GROUP BY
id
提前致谢。
您可以通过多种方式执行此操作。以下使用 join
仅匹配满足状态条件的主要订单 ID:
select coalesce(om.id, o.id) as id
o.suborder, o.mainorder, o.status
from orders o left join
orders om
on o.mainorder = om.id and om.status = 2
where status = 2;
如果匹配,则使用主订单 ID。否则,使用原来的id。
我有 table 个订单和子订单。以及包含产品行的视图。我想 SELECT
所有带有 status = 2
的行,但是如果两者(子订单和主订单)都有 status = 2
,我想要那个而不是子订单 id 有主订单的 id。
这是我的例子 table:
| id | suborder | mainorder | status |
|--------|----------|-----------|--------|
| 000001 | (NULL) | (NULL) | 3 |
| 000002 | (NULL) | (NULL) | 2 |
| 000003 | 1 | 000001 | 2 |
| 000004 | 1 | 000002 | 2 |
所以查询结果为:
| id | suborder | mainorder | status |
|--------|----------|-----------|--------|
| 000002 | (NULL) | (NULL) | 2 |
| 000003 | 1 | 000001 | 2 |
| 000002 | 1 | 000002 | 2 |
所以最后一个 id 改变的原因是 mainorder 有 status = 2
。订单 ID 000003
没有变化,因为订单 000001
没有 status = 2
.
我试过这个查询,但我不知道如何包含状态..
SELECT
CASE
WHEN mainorder IS NULL THEN
id
WHEN mainorder IS NOT NULL THEN
mainorder
END AS final_id,
orders.*
FROM
orders
WHERE
`status` = 2
GROUP BY
id
提前致谢。
您可以通过多种方式执行此操作。以下使用 join
仅匹配满足状态条件的主要订单 ID:
select coalesce(om.id, o.id) as id
o.suborder, o.mainorder, o.status
from orders o left join
orders om
on o.mainorder = om.id and om.status = 2
where status = 2;
如果匹配,则使用主订单 ID。否则,使用原来的id。