Keine Unterabfragen in der FROM-Klausel einer View-Definition erlaubt - Was tun?
am 01.05.2007 23:23:52 von christoph lauterbachHallo Gruppe,
ich habe mir einen Query gebastelt, mit dem ich ein Nested Set so
auslesen kann, dass es mit einer einzigen Schleife vom Client
auslesbar ist. Jetzt wollte ich dieses Trum als View ablegen, da sagt
im MySQL dass man keine Unterabfragen in der FROM-Klausel einer View-
Definition haben darf. Hier aber erstmal Tabelle (vereinfacht) und
Query:
Tabelle 'categories':
+----+-------------------------+---------------+------------ -+
| id | name | startBoundary | endBoundary |
+----+-------------------------+---------------+------------ -+
| 0 | __Root__ | 1 | 36 |
| 2 | Fotografie | 18 | 19 |
| 3 | Baukunst | 16 | 17 |
| .. | ... | ... | ... |
+----+-------------------------+---------------+------------ -+
"Baum-Query":
SELECT `categories`.`id` AS `id`,
`categories`.`name` AS `name`,
`categories`.`startBoundary` AS `startBoundary`,
`father2`.`id` AS `fatherId`,
`categories`.`fatherStartBoundary` AS `fatherStartBoundary`
FROM (SELECT `categories`.`id` AS `id`,
`categories`.`name` AS `name`,
`categories`.`startBoundary` AS `startBoundary`,
max(`father1`.`startBoundary`) AS `fatherStartBoundary`
FROM `categories`,
`categories` `father1`
WHERE (`categories`.`startBoundary` BETWEEN
(`father1`.`startBoundary` + 1) AND (`father1`.`endBoundary` - 1))
GROUP BY `categories`.`id`) `categories`,
`categories` `father2`
WHERE (`categories`.`fatherStartBoundary` =3D
`father2`.`startBoundary`)
ORDER BY `categories`.`startBoundary`;
Das Ergebnis dieses Queries:
+----+-------------------------+---------------+----------
+---------------------+
| id | name | startBoundary | fatherId |
fatherStartBoundary |
+----+-------------------------+---------------+----------
+---------------------+
| 16 | Geisteswissenschaft | 2 | 0
| 1 |
| 11 | Philosophie | 5 | 16
| 2 |
| .. | ... | ... | ...
| ... |
+----+-------------------------+---------------+----------
+---------------------+
Die Spalte "fatherStartBoundary" auszugeben, könnte ich mir natürlich
sparen, das ist sozusagen das noch stehende Baugerüst.
Also hier endlich die Frage: Wie lässt sich ein solcher Query
umschreiben, so dass kein Subselect im FROM-Teil nötig ist? Ein
Konstrukt wie
[..]
WHERE [...] AND `father2`.`startBoundary` =3D `father1`.`startBoundary`
[..]
bringt bei Verwendung von Gruppierung und MAX() ja nichts.
Vielen Dank
Christoph Lauterbach