ich eine Unterabfrage mit Hilfe einer Tabelle filtern, aber es schließt sich eine weitere Tabelle, deren Werte ich brauche auch:Namenskollision, wenn MySQL Unterabfragen verwenden, die eine
SELECT * FROM properties
JOIN (
SELECT persons.*, cities.* FROM persons
JOIN properties.* ON properties.person_id = persons.id
AND (properties.value = 1 OR properties.value = 2)
JOIN cities ON cities.id = persons.city_id
GROUP BY persons.id
HAVING COUNT(DISTINCT properties.id) = 2
) filtered_persons ON filtered_persons.id = properties.person_id
Diese Auseinandersetzungen wegen persons.id
und cities.id
beim Benennen der Unterabfrage filtered_persons
. Die Unterabfrage kommt eigentlich von einem Funktionsaufruf in PHP-Code, sonst würde ich einfach später an cities
teilnehmen.
Das Ergebnis ist eine Liste aller Eigenschaften dieser Personen, für die bestimmte Eigenschaften festgelegt sind.
Die resultierende Abfrage sollte properties.*
, persons.*
und cities.*
haben, da es später verwendet wird, um es weiter zu filtern.
Wie kann ich die Namenskollision vermeiden, ohne die Unterabfrage zu ändern? Ist es überhaupt möglich?
Sie sollten 'select *' nicht mit 'group by' verwenden, daher stimmt etwas mit der Logik Ihrer Abfrage nicht. –
Es scheint, dass 'filtered_persons.id' mehrdeutig ist, weil sie von Personen oder Städten kommen könnte. Du musst das lösen. –
Erweiterung auf was @GordonLinoff sagte; Die Verwendung von 'SELECT persons. *' Mit 'GROUP BY persons.id' sollte in Ordnung sein. Es gibt mir manchmal den Schauer, aber das wird explizit von MySQL unterstützt - vorausgesetzt, dass 'persons.id' ein eindeutiger Bezeichner ist. Probleme treten jedoch auf, wenn Sie auch 'cities. *' Zu diesem 'SELECT' hinzufügen; Wenn der Personendatensatz mehreren Städten zugeordnet ist, wird nur eine Stadt zurückgegeben. Aber die, die du bekommst, wird völlig willkürlich sein. – MatBailie