Klaus: SELECT in WHERE Klausel

Hallo,
also hier gab es ja letzten ein Thema, ob man bestimmte Funktionen lieber per PHP oder SQL Lösen soll.
Also ob man lieber DB1 und dann Db2 abfragen, oder ob man das Kombinieren soll:

Bsp:
SELECT id FROM table1 WHERE aktiv = '1';
$wert = "$row->id,";

SELECT * FROM table2 WHERE userid IN($wert);

Oder
SELECT * FROM table2 AS tab1 WHERE tab1.userid IN(SELECT tab2.id FROM table1 AS tab2 WHERE tab2.aktiv = '1');

Dort wurde aus performance technischen Gründen die zweite Variante empfhohlen.

Jetzt habe ich folgende Abfrage:
SELECT tab1.id
FROM user AS tab1
WHERE tab1.userid =  '2' AND tab1.gruppe
IN (
SELECT tab2.id
FROM gruppen AS tab2
WHERE tab2.admin = '1' )

Diese Abfrage funktioniert bei der gleichen Table bei PHP 4.1 ohne Probleme, aber auf meinem Webserver läuft noch MySQL 3.23.58

Die beiden einzelnen SELECT's funktionieren soweit einwandfrei, nur die Kombination funktioniert nicht.
Und fragt man erst SELECT tab2.id FROM gruppen ab, und setzt das Ergebnis in das IN(..) ein, geht dies ohne Probleme.

Ich habe dies sowohl per phpMyAdmin und per PHP (mysql_query()) probiert, beide liefern folgenden Fehler:
You have an error in your SQL syntax near 'SELECT tab2.id
FROM gruppen....

Liegt das jetzt an der Abfrage, so dass man dies auch noch Umschreiben könnte, und es dann funktionieren würde?
Oder unterstützte MySQL 3.x die verschachtelte SQL Abfrage nicht?

Grüße Klaus

  1. Hallo Klaus,

    SELECT id FROM table1 WHERE aktiv = '1';
    $wert = "$row->id,";

    das wird nicht funktionieren, da "SELECT ... WHERE userid IN (123,)" ungültiges SQL ist, du müsstest schon die IDs in einem Array sammeln und sie per implode() "zusammenkleben"

    SELECT * FROM table2 AS tab1 WHERE tab1.userid IN(SELECT tab2.id FROM table1 AS tab2 WHERE tab2.aktiv = '1');

    ungetestet, sollte aber funktionieren:

    SELECT b.*  
      FROM table1 as a, table2 as b  
      WHERE a.id=b.userid AND a.aktiv=1
    

    (das b.* sollte natürlich noch durch die abzufragenden Spaltennamen ersetzt werden ...)

    Oder unterstützte MySQL 3.x die verschachtelte SQL Abfrage nicht?

    richtig, Subquerys unterstützt mysql erst ab Version 4.1

    Grüße aus Nürnberg
    Tobias

    1. Hallo,

      SELECT id FROM table1 WHERE aktiv = '1';
      $wert = "$row->id,";
      das wird nicht funktionieren, da "SELECT ... WHERE userid IN (123,)" ungültiges SQL ist,

      Das ist mir bewusst. Die Variable $wert wird per Schleife "gefüllt", so das dort dann 1,2,3, stehen würde.
      Dann wird das letzte Zeichen gelöscht, so dass dort nur noch 1,2,3 steht.
      Dies haben ich aber alles aus Gründen der Übersicht weggelassen.

      Oder unterstützte MySQL 3.x die verschachtelte SQL Abfrage nicht?
      richtig, Subquerys unterstützt mysql erst ab Version 4.1

      Danke, genau das war meine Hauptfrage ;)

      Grüße Klaus