Mysql Problem mit UNION
Maehmann 09.10.2005 - 15:23 566 8
Maehmann
OC Addicted
|
Hey,
Meine Query liest aus der gleichen Datenbank-Tabelle unter zwei verschiedenen Bedingungen Daten aus. Dazu verwende ich ein UNION Statement:
SELECT tabelle1.id, [...] FROM tabelle1, [...] WHERE [bedingung1] UNION SELECT tabelle1.id, [...] FROM tabelle1, [...] WHERE [bedingung2] ORDER BY [...]
Nun habe ich aber das Problem, dass es sein kann, dass ein und der selbe Datensatz (gleiche tabelle1.id) zweimal im Result steht.
Ich suche einen Weg das zu verhindern.
Eigentlich müsste es ja funktionieren ein "GROUP BY tabelle1.id" an's Ende der Query anzuhängen, aber leider scheint das dann nur das zweite SELECT-Statement zu betreffen und nicht das Ergebnis der UNION.
PS: "UNION DISTINCT" kann ich nicht verwenden, weil bei den doppelten Datensätzen nicht alle Spalten exakt gleich sind.
Any hints? *tia*
|
gue
Addicted
|
PS: "UNION DISTINCT" kann ich nicht verwenden, weil bei den doppelten Datensätzen nicht alle Spalten exakt gleich sind.  wie kann das sein? Ich verstehe irgendwie nicht, warum du das mit einem UNION machst, wenn das eh aus der selben Tabelle kommt. Du könntest ja auch einfach SELECT DISTINCT tabelle1.id1, [...] FROM tabelle1 WHERE [bedingung1] OR [bedingung2] ORDER BY [...] benutzen, oder?
|
Maehmann
OC Addicted
|
Phew. Wie erklär ich das am besten.  Ich verstehe irgendwie nicht, warum du das mit einem UNION machst, wenn das eh aus der selben Tabelle kommt. Du könntest ja auch Die beiden Queries liefern die selbe Anzahl an Spalten, joinen aber eine unterschiedliche anzahl von tabellen und werden noch dazu dynamisch aufgebaut, weil sich die WHERE Definitionen ändern können. Im Prinzip gibt es eine Tabelle nach dem Schema: pic_id | user_id | theme_id | rating + etliche andere Spalten Die zweite Tabelle sieht so aus: id | pic_id | sec_theme_id In der ersten Tabelle wird die ID des Primären Themas gespeichert. In der zweiten Tabelle eine beliebige Anzahl von Sekundären Themen (auch garkeins). Nun soll mit einem Query so ausgelesen werden, dass zuerst alle Bilder mit einer theme_id kommen und nach dem rating sortiert sind. Dann im Anschluss dann alle mit der theme_id als Sekundäre ID, ebenfalls nach dem rating sortiert. Jedoch dürfen die Bilder mit der selben user_id _nicht_ hintereinander kommen. Also: p, 1 p, 2 p, 3 s, 1 s, 2 s, 3 Das funktioniert auch schon soweit. Nur kann es eben passieren, dass ein Bild sowohl bei den primären als auch den sekundären Bildern aufscheint.
Bearbeitet von Maehmann am 09.10.2005, 16:31
|
gue
Addicted
|
Hm gefinkelt  Wenn deine MySQL Version Subqueries unterstützt, könntest du ja so was im 2. Teil der Vereinigung einbauen, á la ...
UNION
SELECT ... FROM table2
WHERE ... AND user_id NOT IN
(SELECT user_id FROM table1
WHERE ...);
...oder so ähnlich
|
Maehmann
OC Addicted
|
hm ... der denkanstoß ist schon mal nicht schlecht! danke
muss mich noch ein bissl damit spielen *g*
|
vossi
been there, done that
|
wie wärs mit nem group by übers union?
|
Gulinborsti
Addicted
|
Hmm, ganz sicher bin ich mir damit nicht, aber du könntest doch nur die tabelle.id mit dem von dir verwendeten Statement als Subselect verwenden. Dort würde dann das DISTINCT auch greifen... SELECT tabelle.id, [...]
FROM tabelle
WHERE tabelle.id IN
(SELECT DISTINCT tabelle1.id
FROM tabelle1, [...]
WHERE [bedingung1]
UNION
SELECT tabelle1.id
FROM tabelle1, [...]
WHERE [bedingung2]
ORDER BY [...])
edit: Die Sortierung müßtest dann halt auch außerhalb machen, kommt aber drauf an, ob das in deinem Fall noch funktioniert (dein Beispiel habi nicht ganz durchschaut  )
Bearbeitet von Gulinborsti am 10.10.2005, 15:20
|
Maehmann
OC Addicted
|
Hab im mom nicht viel Zeit. Wenn sich das geändert hat, werd ich mich nochmal intensiv mit dem query beschäftigen ... vielleicht find ich noch was anderes als dem union ... danke auf alle fälle für die antworten
|
rettich
Legendwaffle, waffle!
|
just for info: mySQL macht grundsätzlich _immer_ ein union distinct, auch wenn kein distinct dortsteht. du kannst das keyword distinct zwar anfügen (wegen t-sql kompatibilität), es macht aber keinen unterschied.
|