在SQL中创建修改的GROUP选择

时间:2017-08-03 07:49:57

标签: mysql

我正在尝试为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 23的值被跳过,因为他们拥有的PID也与TID = 2一起

谢谢!

1 个答案:

答案 0 :(得分:0)

一般来说,分组是正确的方法。棘手的部分是以指定的方式获得结果,即tid = 2应该是第一个条目。只需按tid排序就可以先得到tid = 1的结果。解决方案是使用方括号y = (x - m)^2m等于您要求的值,因此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