Zur Navigation

Frage zu SELECT-Abfrage

1 AndiN

Hallo Jörg,
ich habe ein interessantes Phänomen bei folgender SQL-Abfrage

SELECT o.ID FROM objekte AS o LEFT JOIN domizile AS d ON o.DomizilID = d.ID LEFT JOIN objektattribute_schlafzimmer p ON p.ObjektID = o.ID  WHERE p.Zimmer = 6 GROUP BY o.ID

Eigentlich sollten hier nur Einträge ausgegeben werden bei denen in der Spalte "Zimmer" der Wert 6 drin steht. Allerdings werden alle Einträge ausgegeben bei denen "Zimmer" den Wert 6 oder höher (!) hat. Hast du dazu eine spontane Idee? Die Datenbank kann ich dir gerne auch zeigen.

22.07.2013 11:12

2 Jörg Kruse

Allerdings werden alle Einträge ausgegeben bei denen "Zimmer" den Wert 6 oder höher (!) hat.

Wie hast du das überprüft? Deine Query gibt p.Zimmer ja nicht aus. Am besten du baust zur Überprüfung das Feld direkt in die Abfrage ein:

SELECT o.ID, p.Zimmer
FROM objekte AS o
LEFT JOIN domizile AS d
ON o.DomizilID = d.ID
LEFT JOIN objektattribute_schlafzimmer AS p 
ON p.ObjektID = o.ID 
WHERE p.Zimmer = 6
GROUP BY o.ID

22.07.2013 13:41

1 Forenmitglied fand diesen Beitrag gut

3 AndiN

Okay, danke. Das Problem scheint wohl doch an anderer Stelle vom Script zu liegen.

22.07.2013 13:54

... 1 Monat später ...

4 AndiN

Ich hatte mal wieder Zeit mich um das Problem zu kümmern und den Auslöser jedoch leider keine Lösung gefunden.

Die Tabelle "objektattribute_schlafzimmer" ist folgendermaßen aufgebaut:

ID 	ObjektID AttributID 	Zimmer
1413 	0 	80 		2
1414 	0 	74 		1
7319 	9 	80 		1
7321	9 	82 		1
7322	10 	54 		1
7324 	10 	66 		3
7325 	10 	80 		1
7326 	10 	80 		2
7327 	10 	82 		1

D.h. also bei meiner Abfrage...

SELECT o.ID
FROM objekte AS o
LEFT JOIN domizile AS d
ON o.DomizilID = d.ID
LEFT JOIN objektattribute_schlafzimmer p
ON p.ObjektID = o.ID
WHERE p.Zimmer = 2 GROUP BY o.ID

...fehlt, dass er nur die ObjektID von Einträgen ausgibt bei denen es nicht noch weitere Einträge gibt bei denen die Zahl in der Zimmer-Spalte höher ist als 2 (in diesem Beispiel). In diesem Beispiel liest er jetzt die ObjektIDs 0 und 10 aus, obwohl das Objekt mit der ObjektID 10 in echt 3 Zimmer hat.

Hat da jemand eine Idee wie ich meine Abfrage ändern muss?

11.09.2013 13:03

5 Jörg Kruse

Vielleicht hilft MAX() da weiter:

SELECT o.ID, MAX(p.zimmer) AS max_zimmer
FROM objekte AS o
LEFT JOIN domizile AS d
ON o.DomizilID = d.ID
LEFT JOIN objektattribute_schlafzimmer p
ON p.ObjektID = o.ID
WHERE p.Zimmer = 2 
AND max_zimmer < 3
GROUP BY o.ID

PS:
das Kürzel "p" finde ich etwas merkwürdig - der Buchstabe kommt in dem Tabellennamen nicht einmal vor - ich würde da eher etwas wie "sz" wählen :)

11.09.2013 14:31 | geändert: 11.09.2013 14:36

6 AndiN

Hallo Jörg,
ich hab noch den kleinen Fehler korrigiert, dass in der ersten Zeile es vermutlich "p.Zimmer" heißen muss (also mit großem Z). Aber es kommt im phpMyAdmin jedoch trotzdem die Fehlermeldung:

"#1054 - Unknown column 'max_zimmer' in 'where clause"

12.09.2013 11:22

7 Jörg Kruse

Ja, das max_zimmer steht erst nach dem GROUP BY zur Verfügung.

Mit HAVING kann man nachträglich filtern, probier mal so:

SELECT o.ID, MAX(p.Zimmer) AS max_zimmer
FROM objekte AS o
LEFT JOIN domizile AS d
ON o.DomizilID = d.ID
LEFT JOIN objektattribute_schlafzimmer p
ON p.ObjektID = o.ID
WHERE p.Zimmer = 2 
GROUP BY o.ID
HAVING max_zimmer < 3

12.09.2013 11:59 | geändert: 12.09.2013 12:04

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]