PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ungewöhnliche select anweisung



msi
28-03-2004, 18:13
Hallo,
ich bräuchte einen select aufruf, der mir aus einer tabelle nur dann alles ausgibt wenn eine spalte in mind. 2 eintragungen gleich ist und in einer anderen Spalte die Werte nicht übereinstimmen.

also bsp, meine tabelle:



id | muss_gl_sein | musss_us_sein
1 | 3 | 5
2 | 6 | 5
3 | 9 | 4
4 | 3 | 5
5 | 6 | 4
6 | 3 | 2
7 | 9 | 4




in diesem fall sollte dies rauskommen:
1 | 3 | 5
4 | 3 | 5
6 | 3 | 2
2 | 6 | 5
5 | 6 | 4


es sollte zuerst einmal so angeordnet sein, dass sie nach muss_gl_sein gruppiert sind (also nicht georndet sondern nur die zahlen die gleich sind, sollen hintereinander folgen)
die 9er von muss_gl_sein kommen nicht raus, weil die muss_ug_sein bei denen ja gleich sind. Bei den 3ern sind zwei dabei die bei muss_ug_sein ungleich sind, also kommen alle 3er bei der ausgabe raus.

gibt es eine gute (effektive) Möglichkeit dies per SQL Query zu machen (ich verwende mySql), oder muss ich das in meinem Script (PHP) lösen, wenn ja, wie mache ich das dort am effektivsten?

danke Markus

mwanaheri
28-03-2004, 18:45
es sollte eigentlich doch so gehen, oder?

select * from datenbank where
feld1 like feld2 and feld2 not like feld3 or
feld2 like feld3 and feld3 not like feld1 or
feld3 like feld1 and feld1 not like feld2;

Bei PostgresQL schien es mir zu klappen.

Allerdings verstehe ich Dein Beispiel nicht so ganz...

msi
30-03-2004, 15:34
Original geschrieben von mwanaheri
es sollte eigentlich doch so gehen, oder?

select * from datenbank where
feld1 like feld2 and feld2 not like feld3 or
feld2 like feld3 and feld3 not like feld1 or
feld3 like feld1 and feld1 not like feld2;

Bei PostgresQL schien es mir zu klappen.

Allerdings verstehe ich Dein Beispiel nicht so ganz...

irgendwas hast du an meiner frage nicht ganz verstanden, es gibt nämlich nur 2 wichtige felder, das id feld ist auto_increment und soll nur angezeigt werden.

sticky bit
31-03-2004, 12:37
SELECT t1.id, t1.muss_gl_sein, t1.musss_us_sein
FROM table t1
WHERE t1.musss_us_sein NOT IN (SELECT t2.musss_us_sein
FROM table t2
WHERE t1.id <> t2.id) AND
t1.muss_gl_sein IN (SELECT t2.muss_gl_sein
FROM table t2
WHERE t1.id <> t2.id);

So müsste das gehen, wird nur vielleicht etwas langsam sein wg. der Subqueries.
Naja zumindest unter Oracle (ist ungetestet zwecks Faulheit jetzt solche Tabellen anzulegen...) aber ob MySQL nicht über die Subqueries stolpert? Neuere Versionen sollten damit auch umgehen können. Probiers aus. Ggf. kann man die Subqueries vielleicht noch durch Joins ersetzten, keinen Plan...

undefined
31-03-2004, 13:04
Original geschrieben von sticky bit
So müsste das gehen, wird nur vielleicht etwas langsam sein wg. der Subqueries.
Du hast das problem angesprochen, mysql ist bei subqueries spürbar langsamer.
Ich würde generell dazu tendieren es mit PHP zu machen. Array sortier Funktionen gibt es dies bezüglich ein Menge ;)