2009-05-23 4 views
1

Ich habe eine MySQL-Abfrage, wo ich eine verschachtelte SELECT haben, die ein Array an die Eltern zurückgibt:Wie speichern Sie Ergebniszeilenanzahl in geschachtelten SELECT?

SELECT ... 
FROM ... 
WHERE ... IN (SELECT .... etc) 

Ich möchte die Anzahl der zurückgegebenen Ergebnisse (Zeilenanzahl) von der verschachtelten SELECT speichern, sondern etwas zu tun wie IN (SELECT count (...), columnA) funktioniert nicht, da das IN nur ein Ergebnis erwartet.

Gibt es eine Möglichkeit, die zurückgegebene Ergebniszahl für die spätere Verwendung in der übergeordneten Anweisung zu speichern?

+0

Könnte etwas sein, was Sie mit JOIN/GROUP BY tun können. Aber Sie müssen ein bisschen mehr ausarbeiten. – VolkerK

+0

Die Abfragedetails sind: SELECT tabA.colA, \t tabA.colB von Taba WHERE tabA.colA IN ( \t SELECT tabA.colA \t von Taba \t WHERE tabA.colB = 1 ) Ich möchte dann die Anzahl der resultierenden Zeilen aus dem geschachtelten SELECT nehmen und diese für eine Division in der Hauptabfrage verwenden (noch nicht geschrieben). –

+0

Sind Sie dies Ihre Frage? Sie brauchen dafür keine Unterabfrage! –

Antwort

0

Wahrscheinlich müssen Sie die Ergebnisse Ihrer verschachtelten Anweisung in eine temporäre Tabelle auswählen. Dann können Sie ein IN machen und später darauf zählen. Ich bin mehr vertraut mit MS-SQL, aber ich denke, sollten Sie in der Lage sein, es so zu tun:

CREATE TEMPORARY TABLE tmp_table AS 
SELECT something 
FROM your_table; 

SELECT ... 
FROM ... 
WHERE ... IN (SELECT * FROM tmp_table); 

SELECT count(*) FROM tmp_table; 

Wenn das nicht funktioniert, können Sie weitere Informationen zu der temporären Tabellenerstellung Erklärung liefern müssen wie mit einem normalen "CREATE TABLE". Ein ähnliches Beispiel finden Sie im MySQL-Handbuch unter here und unter here.

CREATE TEMPORARY TABLE tmp_table 
(
    tableid INT, 
    somedata VARCHAR(50) 
); 

INSERT INTO tmp_table 
SELECT ... 
FROM ... 

SELECT ... 
FROM ... 
WHERE ... IN (SELECT * FROM tmp_table); 

SELECT count(*) FROM tmp_table; 

Rich-

0

Sie erwähnten in Ihrem Kommentar, dass Ihre Abfrage wie folgt aussehen:

SELECT 
    tabA.colA, 
    tabA.colB 
FROM tabA 
WHERE tabA.colA IN (SELECT tabA.colA FROM tabA WHERE tabA.colB = 1) 

Ich könnte etwas fehlen, aber Sie keine Unterabfrage dafür brauchen. Warum nicht Sie tun es in einem normalen Zustand, wo:

SELECT 
    tabA.colA, 
    tabA.colB, 
FROM tabA 
WHERE tabA.colB = 1 
+0

tabA.colB = 1 gibt ein Array zurück. Ich habe das versucht, aber ich bekomme nur eine Reihe von Ergebnissen (d. H. Das erste Element im Array) –

0

Sie IN Prädikat für mehrere Spalten wie folgt verwenden können:

SELECT * 
FROM table 
WHERE (col1, col2) IN 
     (
     SELECT col3, col4 
     FROM othertable 
     ) 

Wenn Sie zusammen mit jedem Wert auswählen COUNT(*) möchten, verwenden dies:

SELECT colA, colB, cnt 
FROM (
     SELECT COUNT(*) AS cnt 
     FROM tabA 
     WHERE colB = 1 
     ) q, 
     tabA 
WHERE colB = 1 
Verwandte Themen