Mysql Problem mit UNION

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/mysql_problem_mit_union_150679/page_1 - zur Vollversion wechseln!


Maehmann schrieb am 09.10.2005 um 15:23

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 schrieb am 09.10.2005 um 15:51

Zitat von Maehmann
PS: "UNION DISTINCT" kann ich nicht verwenden, weil bei den doppelten Datensätzen nicht alle Spalten exakt gleich sind.
:confused: 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 schrieb am 09.10.2005 um 16:26

Phew. Wie erklär ich das am besten. :(

Zitat
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.


gue schrieb am 09.10.2005 um 18:06

Hm gefinkelt :)
Wenn deine MySQL Version Subqueries unterstützt, könntest du ja so was im 2. Teil der Vereinigung einbauen, á la

Code:
...
UNION
SELECT ... FROM table2
WHERE ... AND user_id NOT IN 
  (SELECT user_id FROM table1
   WHERE ...);
...oder so ähnlich ;)


Maehmann schrieb am 09.10.2005 um 18:33

hm ... der denkanstoß ist schon mal nicht schlecht!
danke

muss mich noch ein bissl damit spielen *g*


vossi schrieb am 10.10.2005 um 14:08

wie wärs mit nem group by übers union?


Gulinborsti schrieb am 10.10.2005 um 15:17

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...

Code:
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 ;) )


Maehmann schrieb am 10.10.2005 um 18:05

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 schrieb am 10.10.2005 um 23:59

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.

:)




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025