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 = 0
按 run_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)
这个查询的逻辑非常简单:
- 内部查询 select 是
group_id
的对和对应的 run_order
的最小值,其中 completed = 0
.
- 之后我们将原始的 table 加入到这组对中,这样我们就可以 select 相应的
clue_id
另外。
您可以使用
按每组的元素数排序
ORDER BY COUNT(*) DESC
我有一个 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 = 0
按 run_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)
这个查询的逻辑非常简单:
- 内部查询 select 是
group_id
的对和对应的run_order
的最小值,其中completed = 0
. - 之后我们将原始的 table 加入到这组对中,这样我们就可以 select 相应的
clue_id
另外。
您可以使用
按每组的元素数排序ORDER BY COUNT(*) DESC