2017-03-29 215 views
0

有沒有辦法從select中的子查詢中獲取值?MySQL查詢聚合MAX和子查詢

stop_link表

id | duid | domain_id 
1 | 1 | 1 
2 | 2 | 1 
3 | 1 | 2 
4 | 2 | 2 
5 | 3 | 1 

結果,我想(假設域ID = 2)

duid | domain_id 
3  | 2 

查詢(不工作):

INSERT INTO stop_link (
       duid, 

       domain_id) 
SELECT 
    IFNULL(MAX(sl.duid), 0) + 1 AS duid, 
    sl.domain_id 
FROM 
    stop_link sl 
WHERE sl.domain_id = (SELECT sd.id FROM stop_domain sd LIMIT 1) 

查詢工作,但我想避免設置變量:

SET @domain_id = (SELECT sd.id FROM stop_domain sd LIMIT 1); 
SELECT 
    IFNULL(MAX(sl.duid), 0) + 1 AS duid 
    , @domain_id 
FROM 
    stop_link sl 
WHERE sl.domain_id = @domain_id; 
+2

什麼是你想要的結果的邏輯是什麼? –

+1

解釋你的邏輯,以獲得所需的結果 –

+0

我認爲你所需要做的就是插入一個「GROUP BY domain_id」。 – maraca

回答

0

根據評論中的新信息更改了答案。這聽起來像你在sql_mode中啓用了only_full_group_by。您的查詢可能會與殘疾人工作,但下面也可以爲你工作:

INSERT INTO stop_link (
       duid, 

       domain_id) 

SELECT 
    IFNULL(MAX(sl.duid), 0) + 1 AS duid, 
    sl.domain_id 
FROM 
    stop_link sl 
WHERE sl.domain_id = (SELECT sd.id FROM stop_domain sd LIMIT 1) 
-- ORDER by sl.domain_id DESC LIMIT 1 # Removed in favor of the following line 
GROUP BY sl.domain_id HAVING MAX(sl.id) 
; 

注意,子查詢可能不會返回你希望它是stop_domain.id - 你可能已經打算選擇MAX (sd.id),或者您爲了清楚起見而刪除了WHERE sd.url='foo'

+0

@AC此查詢與我的相同,列名稱是stop_domain表中的id – nenad007

+0

您可以提供該表上的信息(特別是列)呢?關於它不能正常工作(拋出錯誤,意外結果等)? –

+0

表stop_domain有id和domain_url。錯誤是:在沒有GROUP BY的聚合查詢中,SELECT列表的表達式#2包含非聚集列'.sl.domain_id';這是不符合sql_mode = only_full_group_by – nenad007

0

不需要的max()

SELECT 
    IFNULL(sl.duid, 0) + 1 AS duid, 
    sl.domain_id 
FROM 
    stop_link sl 
WHERE sl.domain_id = (SELECT sd.id FROM stop_domain sd LIMIT 1) 
ORDER by sl.id DESC 
LIMIT 1 
+0

當然,max()是必須的,因爲我們必須知道duid的最高值與domain_id – nenad007

+0

結合使用,您是否嘗試過使用'limit 1'來通過DESC命令實現此目的。這應該夠了 –

1

你的意思是這樣的:

/*Your example Table*/ 

DECLARE @T 
TABLE(ID INT,duid INT,domain_id INT) 

INSERT INTO @T 
VALUES 
(1 , 1 , 1), 
(2 , 2 , 1), 
(3 , 1 , 2), 
(4 , 2 , 2), 
(5 , 3 , 1) 

--The query 
SELECT domain_id,Isnull(max(duid),0)+1 [newId] 
FROM @T 
GROUP BY domain_id