2017-08-03 44 views
0

我正在尝试为SQL做可能很标准的事情,但我不知道如何谷歌或搜索它,因为我只能解释我想实现的目标。在SQL中创建已修改的GROUP选择

,如果我有一个表:

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小号23被跳过,因为他们有PID也与TID = 2

一起谢谢您!

+0

'SELECT pid,tid FROM tableX WHERE tid = 2 GROUP BY pid UNION SELECT pid,max(tid)FROM tableX WHERE tid!= 2 GROUP BY pid .... ....尝试以上查询的一些变体.... –

回答

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 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 
+0

是否有可能通过id命令它们并按此方式组合? – Banana

+0

查看我最新答案的最后部分。 – Paul