2009-05-23 6 views
1

J'ai une requête MySQL où j'ai un imbriquée SELECT qui retourne un tableau au parent:Comment stockez-vous le nombre de lignes de résultats dans SELECT imbriqué?

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

je voudrais enregistrer le nombre de résultats renvoyés (de nombre de lignes) de la commande SELECT imbriquée, mais faire quelque chose comme IN (SELECT count (...), columnA) ne fonctionne pas, car l'IN attend un seul résultat.

Existe-t-il un moyen de stocker le nombre de résultats renvoyés pour une utilisation ultérieure dans l'instruction parent?

+0

Peut être quelque chose que vous pouvez faire avec JOIN/GROUP BY. Mais vous devez élaborer un peu plus. – VolkerK

+0

Les détails de la requête sont: SELECT tabA.colA, \t tabA.colB OU DE TABA tabA.colA IN (SELECT \t tabA.colA \t de Taba \t OÙ tabA.colB = 1 ) Je voudrais alors prendre le nombre de lignes résultantes du SELECT imbriqué et l'utiliser pour une division dans la requête principale (pas encore écrite). –

+0

Est-ce votre question? vous n'avez pas besoin d'une sous-requête pour ça! –

Répondre

0

Vous allez probablement devoir sélectionner les résultats de votre instruction imbriquée dans une table temporaire. Ensuite, vous pouvez faire un IN et un compte plus tard. Je suis plus familier avec MS-SQL, mais je pense que vous devriez être en mesure de le faire comme ceci:

CREATE TEMPORARY TABLE tmp_table AS 
SELECT something 
FROM your_table; 

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

SELECT count(*) FROM tmp_table; 

Si cela ne fonctionne pas, vous pouvez avoir à fournir tous les détails à la déclaration de création de table temporaire comme vous le feriez avec un "CREATE TABLE" normal. Voir here dans le manuel MySQL, et here pour un exemple similaire.

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

Vous avez mentionné dans votre commentaire que votre requête ressemble à ceci:

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

je pourrais manquer quelque chose, mais vous n'avez pas besoin d'un sous-requête pour cela. Pourquoi faites-vous pas dans un état normal où:

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

tabA.colB = 1 renvoie un tableau. J'ai essayé cela, mais j'ai juste un ensemble de résultats (c'est-à-dire le premier élément du tableau) –

0

Vous pouvez utiliser IN prédicats pour plusieurs colonnes comme ceci:

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

Si vous voulez sélectionner COUNT(*) avec chaque valeur, l'utilisation ceci:

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