Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MySQL Query (https://www.delphipraxis.net/89266-mysql-query.html)

Baeuerle 28. Mär 2007 19:57

Datenbank: MySQL • Version: 3.23.58 • Zugriff über: ZEOS

MySQL Query
 
Hallo zusammen,

kann ich die folgende SQL-Abfrage auch ohne subselect umsetzen? Die MySQL Version des Hosters unterstützt leider keine Subselects :-((

Es handels sich um eine Nested Set bei dem nur ein bestimmtes level angezeigt werden soll.


select aa.* from (
SELECT n.id, n.bez, n.lft, n.rgt,
count(*)-1+(n.lft>1) AS level
FROM conf n, conf p
WHERE n.lft BETWEEN p.lft AND p.rgt
AND (p.id != n.id OR n.lft = 1)
GROUP BY n.id
ORDER BY n.lft) aa
where aa.level = X

X = Level das angezeigt werden soll

Danke im voraus

Baeuerle

daddy 30. Mär 2007 10:11

Re: MySQL Query
 
Zwei Fragen:

1. Beim inneren Select wird ein "Group By" nur auf einen Teil der Ergebnisspalten gemacht. Das funktioniert doch aber gar nicht, wenn die restlichen Spalten nicht Aggregate wie SUM, AVG etc. sind.

2. Wofür wird denn überhaupt ein äußeres Select um das innere herumgelegt? Würde nicht etwas in der Art
SQL-Code:
SELECT n.id, n.bez, n.lft, n.rgt,
count(*)-1+(n.lft>1) AS level
FROM conf n, conf p
WHERE n.lft BETWEEN p.lft AND p.rgt
AND (p.id != n.id OR n.lft = 1)
AND count(*)-1+(n.lft>1) = X
GROUP BY n.id
ORDER BY n.lft
zum gleichen Ergebnis führen? Wobei allerdings zusätzlich das "Group By"-Problem aus meiner ersten Frage berücksichtigt werden muss. Evtl. muss das "count(*)-1+(n.lft>1) = X" dann in eine Having-Klausel.

Baeuerle 30. Mär 2007 13:10

Re: MySQL Query
 
Danke für deine Antwort:

zu 2) In der where-klausel können keine aggregatfunktionen wie count(), sum()... benutzt werden!!!

Angel4585 30. Mär 2007 14:04

Re: MySQL Query
 
Ich versteh zwar nicht um was es geht, aber so in etwa würds ich machen:

SQL-Code:
SELECT n.id, n.bez, n.lft, n.rgt, count(*)-1+(n.lft>1) AS level
FROM conf n, conf p
WHERE n.lft BETWEEN p.lft AND p.rgt AND (p.id != n.id OR n.lft = 1)
and((select (count(*)-1+(n2.lft>1)) from conf n2)= X )
GROUP BY n.id
ORDER BY n.lft
//Edit: ungetestet
//Edit2: kannst du sagen um was es geht? Vllt geht das komplett einfacher :zwinker: (*Stift Ende*)

daddy 30. Mär 2007 16:42

Re: MySQL Query
 
Eben weil Count etc. nicht in der Where-Klausel benutzt werden können, muss es in die Having-Klausel aufgenommen werden. Dann sollte es aber doch mit einem einzelnen Select funktionieren.
Aber mal 'ne andere Frage: was bewirkt denn überhaupt "count(*)-1+(n.lft>1)=X" bzw. was bedeutet das ">" in dieser Klausel?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz