Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Komplizierte SELECT Abfrage... (https://www.delphipraxis.net/109043-komplizierte-select-abfrage.html)

sniper_w 23. Feb 2008 11:19

Datenbank: mysql • Version: 5 • Zugriff über: zeos

Komplizierte SELECT Abfrage...
 
Hi,
Ich habe folgende 2 Tabellen:
1: parents
id (int), name (varchar) , gender (int), ....
2: children
id (int), parent_id (int), name(varchar), gender (int), ...

Jetzt wollte ich eine SELECT Abfrage machen, deren Resultat inetwa so aussehen sollte:

parents.id, parents.name....

wo nur "parents" die ein "child" haben da sind und die noch dazu noch männlich sind...

gender = 1 = männlich


SQL-Code:
select * from parents where gender = 1 and ???

Matze 23. Feb 2008 11:22

Re: Komplizierte SELECT Abfrage...
 
Grob aus dem Kopf:

SQL-Code:
SELECT p.id, p.name FROM parents p
LEFT JOIN children c
    ON c.parent_id = p.id
WHERE p.gender = 1
GROUP BY p.parent_id

Jelly 23. Feb 2008 11:57

Re: Komplizierte SELECT Abfrage...
 
Zitat:

Zitat von sniper_w
wo nur "parents" die ein "child" haben da sind und die noch dazu noch männlich sind...

Meinst du mir EIN Kind genau eins oder mindestens eins ?

Um alle Eltern zu bekommen mit mindestens einem Kind, ist die Formulierung von Matze nicht ganz korrekt... Er hat auf die falsche Seite gejoined.

SQL-Code:
SELECT p.parent_id, p.name, count(c.child_id) as BubCount FROM parents p
RIGHT OUTER JOIN children c
    ON c.parent_id = p.parent_id
WHERE p.gender = 1 
GROUP BY p.parent_id, p.name

sniper_w 23. Feb 2008 12:01

Re: Komplizierte SELECT Abfrage...
 
Zitat:

Meinst du mir EIN Kind genau eins oder mindestens eins ?
Es tut mir leid, das habe ich vergessen. Es sollte mindestens ein Kind vorhanden sein.

Matze 23. Feb 2008 12:04

Re: Komplizierte SELECT Abfrage...
 
Die ganze Joinerei mach ich jedesmal falsch. :mrgreen: Daher auch "grob". *g*

Jelly 23. Feb 2008 12:06

Re: Komplizierte SELECT Abfrage...
 
Zitat:

Zitat von Matze
Die ganze Joinerei mach ich jedesmal falsch. :mrgreen: Daher auch "grob". *g*

Ist ja im Grunde nicht so schwer, man muss sich nur einmal dran gewöhnen... Lustig wirds nur wenns mehrere Tabellen sind, und da inner joins, left joins und full joins gemischt werden. Da muss man höllisch aufpassen (keine outer joins vor inner joins)

@sniper: Du müsstest ja dann jetzt eine Lösung haben... Funktioniert sie?

sniper_w 23. Feb 2008 12:14

Re: Komplizierte SELECT Abfrage...
 
Ja es funktioniert...ich teste es immernoch, aber es schient zu funktionieren.
Vielen Dank.

DeddyH 23. Feb 2008 12:20

Re: Komplizierte SELECT Abfrage...
 
Das müsste aber doch auch mit einem INNER JOIN gehen, oder irre ich mich?
SQL-Code:
SELECT p.id, p.name, COUNT(*)
FROM parents p
JOIN children c ON c.parent_id = p.id
WHERE c.gender = 1
GROUP BY p.id, p.name

sniper_w 23. Feb 2008 12:26

Re: Komplizierte SELECT Abfrage...
 
Ich brauche eigentlich
SQL-Code:
WHERE [b]p[/b].gender = 1
aber dein Vorschlag funktioniert auch!

PS: Warum werden beide Felder "gegroupt"

SQL-Code:
GROUP BY p.id, p.name
Sollte es eigentlich nicht nur ein ausreichen.

DeddyH 23. Feb 2008 12:41

Re: Komplizierte SELECT Abfrage...
 
Wenn Du Aggregatfunktionen benutzt (hier COUNT), müssen alle Nicht-Aggregatfelder in die Gruppierung.

mkinzler 23. Feb 2008 12:49

Re: Komplizierte SELECT Abfrage...
 
U. U. kann man Felder auch in Aggegate umwandeln

Jelly 23. Feb 2008 17:14

Re: Komplizierte SELECT Abfrage...
 
Zitat:

Zitat von DeddyH
Das müsste aber doch auch mit einem INNER JOIN gehen, oder irre ich mich?

Öhm.... Ja... Natürlich... Matze hat mich mit seinem outer join nur so irritiert :wall:

Inner Join sollte auf jeden Fall bevorzugt werden, aus Performance Gründen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:38 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-2025 by Thomas Breitkreuz