MySQL MIN() 按列限制

MySQL MIN() limit by column

我有一个 MySQL table 格式如下:

group_clue:
---------------------------------------------------
| id | group_id | clue_id | completed | run_order |
---------------------------------------------------
|  1 |        1 |       2 |         1 |         1 |
|  2 |        1 |       6 |         1 |         2 |
|  3 |        1 |       4 |         1 |         3 |
|  4 |        1 |       3 |         0 |         4 |
|  5 |        1 |       1 |         0 |         5 |
|  6 |        1 |       5 |         0 |         6 |
|  7 |        2 |       9 |         1 |         1 |
|  8 |        2 |       2 |         0 |         2 |
 ...
---------------------------------------------------

上面group_clue中的数据被构造成每个group_id在某些run_order处有每个clue_id(范围从1到[=8的数量=]s 而不是针对特定组重复)。

第一个问题

我想创建一个 table,显示每个 group_id 的第一个 clue_id,其中 completed = 0run_order 排序(别名为 current_clue).使用上面的示例,这将给出:

---------------------------
| group_id | current_clue |
---------------------------
|        1 |            3 |
|        2 |            2 |
---------------------------

我的初步尝试是:

SELECT group_id, MIN(clue_id) as current_clue
FROM group_clue
WHERE completed = 0
GROUP BY group_id

然而,这returns每个group_id相同clue_id

第二题

根据第一个问题的数据,我想组成一个最终的 table,其中我 GROUP_CONCAT() 这些结果,以便它包含每个 current_clue 和每个 group_id 包含 current_clue。我还希望它从 group_ids 最多的线索到最少的线索排序。结果 table 的示例是:

--------------------
| clue | group_ids |
--------------------
|    3 | 1,5,4,3   |
|    2 | 2,6       |
--------------------

我不知道顺序。我的初步尝试是:

SELECT clue_id, GROUP_CONCAT(group_id)
FROM [resulting_table]
GROUP BY clue_id
ORDER BY [something]

感谢任何帮助:哪些查询适合这种情况?

你的问题的第一部分可以这样解决(它期望 run_order 每个组都是唯一的):

    SELECT t1.group_id,
           t1.clue_id AS current_clue
      FROM group_clue t1
INNER JOIN (SELECT group_id,
                   MIN(run_order) as run_order
              FROM group_clue
             WHERE completed = 0
          GROUP BY group_id) t2 USING (group_id, run_order)

这个查询的逻辑非常简单:

  1. 内部查询 select 是 group_id 的对和对应的 run_order 的最小值,其中 completed = 0.
  2. 之后我们将原始的 table 加入到这组对中,这样我们就可以 select 相应的 clue_id 另外。

您可以使用

按每组的元素数排序
ORDER BY COUNT(*) DESC