【问题标题】:How can I ordering my mysql query to double criteria?如何订购我的 mysql 查询以双重标准?
【发布时间】:2023-03-07 08:01:02
【问题描述】:

我的 SQL 查询有问题。 在一个表中,我有名称为 id 和 subid 的列。一些产品通过同一张表中的 subid 连接到其他产品。 示例:

ID   | Name     |   Status    |   Subid | Location
---------------------------------------------------------
1    | Milk     |   SA        |         |  Box 1
2    | MyDay    |   SA        |   1     |
3    | Kitkat   |   SA        |   4     |
4    | Chocolate|   SA        |         |  Box 2
5    | Twix     |   SA        |   4     | 
6    | Bounty   |   SA        |   4     |
7    | Milkbox  |   SA        |   1     |

表格中还有许多结果。

我要查询 SELECT * FROM products WHERE status='SA' ORDER BY Location ASC, ...

我希望我的排序看起来像这样:

ID   | Name     |   Status    |   Subid | Location
---------------------------------------------------------
4    | Chocolate|   SA        |         |  Box 2 // If it's parent result
3    | Kitkat   |   SA        |   4     |        // It's a child for Choco
5    | Twix     |   SA        |   4     |        // It's a child for Choco 
6    | Bounty   |   SA        |   4     |        // It's a child for Choco
1    | Milk     |   SA        |         |  Box 1 // If it's parent result
2    | MyDay    |   SA        |   1     |        // It's a child for Milk
7    | Milkbox  |   SA        |   1     |        // It's a child for Milk

在每个父结果显示他的孩子通过 subid 连接到 id 之后

有什么办法吗?

提前致谢。

【问题讨论】:

  • “按所有产品订购”是什么意思?您发布的所有示例均未显示按 Name 排序的数据。
  • 如果我理解您想要的结果,您的问题有点不完整。你应该问的是:“我怎样才能先按位置订购产品,然后再按子产品订购”
  • 显示所需的结果,有助于我们了解您的 OP。
  • @maSTAShuFu 它就在那里......只是不够清楚,第二个结果是想要的:)
  • @maSTAShuFu:OP 已经做到了。查看问题中的决赛桌。

标签: mysql sql


【解决方案1】:

如果我理解正确,您可以使用:

select t.*
from t
order by coalesce(subid, id),
         (case when subid is null then 1 else 2 end);

Here 是一个 dbfiddle。

【讨论】:

  • 没有。我希望在每个主 ID 之后对每个子 ID 进行排序。在这种类型的查询中,首先对所有子 ID 为空的产品进行排序,然后对其他不为空的子 ID 进行排序。
  • @RossenVassilev 。 . .我不跟。这将返回完全您在问题中指定的顺序。
【解决方案2】:

您可以(自己)加入父产品并按其位置或子产品的位置(如果未找到父产品)和subid 不是NULL 来将父产品置于顶部每个位置。

SELECT t1.*
       FROM elbat t1
            LEFT JOIN elbat t2
                      ON t2.id = t1.subid
       WHERE t1.status = 'SA'
       ORDER BY coalesce(t2.location,
                         t1.location),
                t1.subid IS NOT NULL;

【讨论】:

  • 我只有一张桌子。两列都在一个表中。
  • @RossenVassilev:而且我的查询只使用一张表... ;)
  • 请查看我编辑的问题帖子。你现在能理解我了吗?在每个父母结果之后显示他的孩子结果。现在这个查询首先显示每个父母的所有孩子,然后显示所有父母。在 WHERE 子句中,我在 mysql 语法中有一个错误:“#1052 - where 子句中的列‘状态’不明确”
  • @RossenVassilev:是的,没错,我错过了status 的资格。我修好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多