【问题标题】:1 select query to sort rows according to 2 columns?1 选择查询根据 2 列对行进行排序?
【发布时间】:2016-11-24 10:27:54
【问题描述】:

我想知道是否可以通过一个查询来实现某些目标。这是我的表结构,知道 (id, id_attached) 是唯一索引

id      id_attached     name
20      0               Name of row 1
21      0               Name of row 2
22      20              Name of row 3
23      20              Name of row 4
15      20              Name of row 5

一个查询是否可以按此顺序选择行。我需要使用 GROUP BY id,但同时我需要为第 2 行设置 2 个单独的行?

20  Name of row 1
  15   Name of row 5
  22   Name of row 3
  23   Name of row 4
21  Name of row 2

【问题讨论】:

  • 这个结果有什么逻辑吗?
  • 感谢您的快速回复,我一直对社区的反应印象深刻 :) 我想要这个结果,以便让客户清楚地了解第 3 行和第 4 行属于第 1 行

标签: php mysql subquery


【解决方案1】:

你可以这样排序:

SELECT *
from my_table
ORDER BY IF(`id_attached` is NULL, id, `id_attached`),id;

第二个问题:

SELECT * from my_table ORDER BY IF(`id_attached` = 0, id, `id_attached`),id;

结果现在与您的问题相同。是不是对的再问我一次,对不起

示例

mysql> select * from my_table;
+------+-------------+---------------+
| id   | id_attached | name          |
+------+-------------+---------------+
|    1 |        NULL | Name of row 1 |
|    2 |        NULL | Name of row 2 |
|    3 |           1 | Name of row 3 |
|    4 |           1 | Name of row 4 |
+------+-------------+---------------+
4 rows in set (0,00 sec)

mysql>
mysql>
mysql> SELECT * from my_table
    -> ORDER BY IF(`id_attached` is NULL, id, `id_attached`),id;
+------+-------------+---------------+
| id   | id_attached | name          |
+------+-------------+---------------+
|    1 |        NULL | Name of row 1 |
|    3 |           1 | Name of row 3 |
|    4 |           1 | Name of row 4 |
|    2 |        NULL | Name of row 2 |
+------+-------------+---------------+
4 rows in set (0,00 sec)

mysql>

带子顺序的示例

SELECT * from my_table m ORDER BY IF(id_attached = 0, id, id_attached+0.1),id;

带有新字段的示例

这将自动更新新字段。仅当 ID 不是 AUTO_INC 时才有效

ALTER TABLE my_table
add COLUMN myorder INT GENERATED ALWAYS
AS (
    IF(`id_attached` = 0, id<<1, (`id_attached`<<1) +1) 
    ) STORED
;

ALTER TABLE my_table ADD INDEX idx_myorder (myorder);

结果

mysql> select * from my_table;
+----+-------------+----------------+---------+
| id | id_attached | name           | myorder |
+----+-------------+----------------+---------+
| 15 |          20 |  Name of row 5 |      41 |
| 20 |           0 |  Name of row 1 |      40 |
| 21 |           0 |  Name of row 2 |      42 |
| 22 |          20 |  Name of row 3 |      41 |
| 23 |          20 |  Name of row 4 |      41 |
+----+-------------+----------------+---------+
5 rows in set (0,00 sec)

mysql>

【讨论】:

  • 哇,太神奇了,没想到这个。非常感谢 :) 但是,我只是忘记了一个可能会改变结果的小细节。由于一些 LET & INNER JOINS,我需要使用 GROUP BY。我将更新我的初始帖子,以便您更好地了解我的需求。再次感谢
  • @Websphere - 我已经更新了我对你第二个问题的回答。请再次测试
  • 实际上它并没有输出我想要的结果,我需要行 id 2 出现两次,因为它被认为是常规行,并且还附加到 tow id 1 (请参阅输出结果在我最初的帖子中)
  • 您好,只是想让您知道,一个简单的GROUP BY id, id_attached 成功了 :) 感谢@Bernd 抽出宝贵时间;)
  • 嗨@Bernd,我刚刚意识到查询无法正常工作的情况:当一个附加产品的ID小于父产品时(在我的示例中为第5行)。那么首先显示的是第 5 行,并且不尊重层次结构:/ 知道如何解决它吗?非常感谢
猜你喜欢
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 2017-05-09
  • 2013-04-02
  • 2021-03-08
相关资源
最近更新 更多