我正在尝试为SQL做很标准的事情,但我不知道如何谷歌或搜索它,因为我只能解释我想要实现的目标。
如果我有一张桌子:
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
s 2
和3
的值被跳过,因为他们拥有的PID
也与TID = 2
一起
谢谢!
答案 0 :(得分:0)
一般来说,分组是正确的方法。棘手的部分是以指定的方式获得结果,即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