• 19.04.2024, 07:56
  • Registrieren
  • Anmelden
  • Sie sind nicht angemeldet.

 

Lieber Besucher, herzlich willkommen bei: Aqua Computer Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

SQL-Umwandlung

Montag, 21. März 2005, 00:18

ich bräuchte hilfe bei der umwandlung eines sql-queries mit subquery in einen solchen, der ohne subquery auskommt und nur joins benutzt.

grund ist der dass ich auf mysql 4.0 festgelegt bin und erst mysql 4.1 subqueries unterstützt. :(

einige wenige simple beispiele zur umwandlung gibt es hier: http://dev.mysql.com/doc/mysql/en/rewriting-subqueries.html
bringt mich aber in meinem fall auch nicht so richtig weiter.
davon abgesehen würde ich auch richtige (LEFT) JOINs statt deren uralt-schreibweise bevorzugen. das klappt im prinzip, aber nicht im speziellen.

hier das gute stück:

Quellcode

1
2
3
4
5
6
7
8
9
SELECT id, parent_id, title
FROM table
WHERE parent_id = 0
   OR parent_id = (
    SELECT parent_id
    FROM table
    WHERE id = %s
)
ORDER BY id ASC;

wobei %s meine substitutionsvariable ("platzhalter") ist und da ne zahl reinkommt.
IN würde ich benutzen, das haut aber schätzungweise mit nem subquery (den ich ja eh nicht benutzen kann) als eins von mehreren elementen vermutlich sowieso nicht hin.

die tabelle sieht in etwa so aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
+----+-----------+----------------------------+
| id | parent_id | title______________________|
+----+-----------+----------------------------+
|  1 | ________0 | Level 0, no Branch, Item A |
|  2 | ________0 | Level 0, no Branch, Item B |
|  3 | ________0 | Level 0, no Branch, Item C |
|  4 | ________0 | Level 0, no Branch, Item D |
|  5 | ________1 | Level 1, Branch 1,  Item A |
|  6 | ________1 | Level 1, Branch 1,  Item B |
|  7 | ________1 | Level 1, Branch 1,  Item C |
|  8 | ________2 | Level 1, Branch 2,  Item A |
|  9 | ________2 | Level 1, Branch 2,  Item B |
+----+-----------+----------------------------+

es soll auch nur zwei level geben, es kann also nur in zwei dimensionen verschachtelt werden.

ich hoffe, hier treibt sich der eine oder andere rum, der mir da weiterhelfen kann.

Re: SQL-Umwandlung

Dienstag, 22. März 2005, 03:01

wie wärs mit einer temp tabelle?

edith fragt: wenn du in der subquery die gleiche tabelle abfragst, warum schreibst du nicht einfach:

SELECT id, parent_id, title
FROM table
WHERE (parent_id = 0) OR (parent_id = %s)
ORDER BY id ASC;
When you come across a big kettle of crazy, it's best not to stir it.

Muhahahahahaha, pwned du kacknoob!
*gockel gockel boaarrcck*

Re: SQL-Umwandlung

Mittwoch, 23. März 2005, 22:11

hmhmhm, ich schau mir das nochmal in ruhe an aber das bringt es wohl so noch nicht ganz. kann ich ja im detail nochmal erläutern. ganz so einfach isses nich und ein self-join wäre da wohl das mindeste.

andererseits habe ich eine lösung (zwei einzelne queries) gefunden und werde mich mit der wohl bis zu meiner verfügbarkeit über mysql 4.1 noch gerade über wasser halten können ;)

Re: SQL-Umwandlung

Mittwoch, 23. März 2005, 22:18

Zitat von »Y0Gi«


Quellcode

1
2
3
4
5
6
7
8
9
SELECT id, parent_id, title
FROM table
WHERE parent_id = 0
   OR parent_id = (
    SELECT parent_id
    FROM table
    WHERE id = %s
)[url]http://www.aqua-computer-systeme.de/cgi-bin/YaBB/YaBB.pl?board=6;action=modify;message=3;thread=1111357096[/url]
ORDER BY id ASC;


SELECT t.id,t.parent_id, t.title FROM table t JOIN table t2 ON (t1.parent_id = t2.parent_id) WHERE t.parent_id = 0 OR (t2.id= %s AND t2.id <> NULL);

das sollte theoretisch deinen Wunsch erfüllen.

Allerdings habe ich lange kein mysql mehr programmiert, das taucht einfach nix ;D
c++: The power, elegance and simplicity of a hand grenade.