2017-08-03 8 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