"We are back" « oc.at

Mysql Problem mit UNION

Maehmann 09.10.2005 - 15:23 566 8
Posts

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
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
Avatar
Registered: Feb 2003
Location: Linz
Posts: 400
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

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
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.
Bearbeitet von Maehmann am 09.10.2005, 16:31

gue

Addicted
Avatar
Registered: Feb 2003
Location: Linz
Posts: 400
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

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
hm ... der denkanstoß ist schon mal nicht schlecht!
danke

muss mich noch ein bissl damit spielen *g*

vossi

been there, done that
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 1436
wie wärs mit nem group by übers union?

Gulinborsti

Addicted
Avatar
Registered: Mar 2004
Location: Wien
Posts: 469
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 ;) )
Bearbeitet von Gulinborsti am 10.10.2005, 15:20

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
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

Legend
waffle, waffle!
Avatar
Registered: Jan 2004
Location: wien
Posts: 794
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.

:)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz