我正在尝试为 SQL 做一些非常标准的事情,但我不知道如何谷歌或搜索它,因为我只能解释我想要实现的目标。
如果我有一张 table :
Table X:
ID | PID | TID
1 | 1 | 2
2 | 1 | 3
3 | 2 | 3
4 | 3 | 4
5 | 4 | 1
6 | 2 | 2
我想按PID
分组(从整个表中仅获取每个PID
一次),但一定要获取指定中的值>TID
(因为正常组只会随机选择它们)。那么,如果将 TID
指定为 '2'
,我希望查询结果是什么:
Result:
ID | PID | TID
1 | 1 | 2
4 | 3 | 4 -- 4 because from all over the table and it does not have TID = 2 where PID = 3
5 | 4 | 1 -- 5 because the same as above
6 | 2 | 2 -- This is where the normal GROUP would mess up as it would give ID = 3 instead of ID = 6
具有 ID
的 2
和 3
的值将被跳过,因为它们具有的 PID
也与 TID = 2
谢谢!
最佳答案
总的来说,分组是正确的方式。棘手的部分是获取按指定方式排序的结果,即 tid=2 应该是第一个条目。仅按 tid 排序会首先给出 tid=1 结果。解决方案是使用平方函数 y = (x - m)^2
,其中 m
等于您要查找的值,因此 m = 2
.
将所有这些打包到一个查询结果中
SELECT
SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY (POW((tid - 2), 2))), ',', 1 ),
pid,
SUBSTRING_INDEX(GROUP_CONCAT(tid ORDER BY (POW((tid - 2), 2))), ',', 1 )
FROM so1
GROUP BY pid
ORDER BY AVG((POW((tid - 2), 2))) ASC
产生
id pid tid
1 1 2
6 2 2
5 4 1
4 3 4
关于请求按 id
对结果进行排序的注释,您可以将查询包装在一个简单的 select 语句中:
SELECT x.*
FROM (
SELECT
SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY (POW((tid - 2), 2))), ',', 1 ) as id,
pid,
SUBSTRING_INDEX(GROUP_CONCAT(tid ORDER BY (POW((tid - 2), 2))), ',', 1 ) as tid
FROM so1
GROUP BY pid
ORDER BY AVG((POW((tid - 2), 2))) ASC
) x
ORDER BY x.id
关于mysql - 在 SQL 中创建修改后的 GROUP 选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45478024/