2017-03-29 2 views
0

Gibt es eine Möglichkeit Wert aus einer Unterabfrage in zu bekommen, wo innen wählen?MySQL Query-Aggregat MAX und Unterabfrage

stop_link Tabelle

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

Ergebnis, das ich will (nehmen domain_id = 2)

duid | domain_id 
3  | 2 

Query (nicht funktioniert):

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) 

Abfrage funktioniert, aber ich möchte vermeiden die eingestellte Variable:

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

Was ist die Logik für das Ergebnis, das Sie wollen? –

+1

erklären Sie Ihre Logik, um das gewünschte Ergebnis zu erhalten –

+0

Ich denke, alles, was Sie tun müssen, ist eine 'GROUP BY domain_id' einzufügen. – maraca

Antwort

0

Veränderte Antwort basierend auf neuen Informationen aus den Kommentaren. Es klingt, als ob Sie only_full_group_by in Ihrem sql_mode aktiviert haben. Ihre Anfrage wird wahrscheinlich mit dem behinderten funktionieren würde, aber die folgenden kann auch für Sie arbeiten:

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) 
; 

Beachten Sie, dass die Unterabfrage nicht die stop_domain.id zurückkehren können, dass Sie es wollen - Sie könnten gedacht haben MAX auszuwählen (sd.id), oder vielleicht haben Sie gerade ein WHERE sd.url='foo' aus Gründen der Klarheit entfernt.

+0

@AC diese Abfrage ist die gleiche wie meine mehr klar sein, ist der Spaltenname-ID in der Tabelle stop_domain – nenad007

+0

Können Sie die Informationen auf dieser Tabelle geben (Spalten, insbesondere) dann? Und darüber, wie genau es nicht funktioniert (Wurffehler, unerwartetes Ergebnis, etc.)? –

+0

Die Tabelle stop_domain hat id und domain_url. Der Fehler ist: In der aggregierten Abfrage ohne GROUP BY enthält der Ausdruck # 2 der SELECT-Liste die nicht aggregierte Spalte '.sl.domain_id'; das ist inkompatibel mit sql_mode = only_full_group_by – nenad007

0

Keine Notwendigkeit der 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

Sicher max() benötigt wird, als wir den höchsten Wert von DUID in Kombination mit domain_id – nenad007

+0

haben Sie es versucht, wissen müssen, verwenden Sie 'Grenze 1' dies zu erreichen mit', um von DESC'. Das sollte genug sein –

1

Haben Sie so etwas wie dies bedeuten:

/*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