Computer Hardware Forum - TweakPC

Computer Hardware Forum - TweakPC (https://www.tweakpc.de/forum/)
-   Programmiersprachen (https://www.tweakpc.de/forum/programmiersprachen/)
-   -   MySQL: Identifizieren, welche WHERE-Klausel zugeschlagen hat (https://www.tweakpc.de/forum/programmiersprachen/53923-mysql-identifizieren-welche-where-klausel-zugeschlagen.html)

Fabian 23.12.2007 10:45

MySQL: Identifizieren, welche WHERE-Klausel zugeschlagen hat
 
Hallo,

ich habe eine MySQL-Abfrage, in der drei WHERE-Klauseln eingebaut sind. Ich würde nun gerne als erstes die Ergebnisse ausgeben, die durch die erste WHERE-Klausel erfüllt wurde, dann die zweite und dann die Dritte. Also sprich:

SELECT * FROM t1
WHERE ( t1.c2 = 1 ) OR ( t1.c3 = 'test' ) OR ( t1.c2 = 2 )

Und die Ergebnisse sollen dann so ausgegeben werden:
1. c2 = 1
2. c2 = 1
3. c3 = 'test'
4. c3 = 'test'
5. c2 = 2

Irgendwelche Ideen, wie man so etwas umsetzen kann?

PS: Achso gibt es ferner eine Möglichkeit, weitere Attribute an das Ergebnis anzuhängen, um diese später nutzen zu können. Ich möchte nachher die Ergebnisse mit "c2 = 1" bei der Ausgabe kennzeichnen.

tele 23.12.2007 12:41

AW: MySQL: Identifizieren, welche WHERE-Klausel zugeschlagen hat
 
Gibts dafür nicht den Group-By Clause? GGf mit Subselect im Group-by

Fabian 23.12.2007 15:05

AW: MySQL: Identifizieren, welche WHERE-Klausel zugeschlagen hat
 
Mit GROUP BY könnte ich nur die Ergebnisse nachher zusammen fassen, oder?

Ich möchte aber wissen, welche WHERE-Klausel, dazu geführt hat, dass die entsprechende Zeile im Ergebnis auftaucht.

PS: Ne ich glaube ich habe da nichts gefunden ... aber vielleicht hast du ja auch noch einen konkreten Tip.

BenniG. 23.12.2007 23:22

AW: MySQL: Identifizieren, welche WHERE-Klausel zugeschlagen hat
 
Du könntest ein UNION versuchen:
[code]
SELECT * FROM t1
WHERE ( t1.c2 = 1 )
union
select * from t1
where ( t1.c3 = 'test' )
union
select * from t1
where ( t1.c2 = 2 )
[/code]
Oder alternativ ein order by:
[code]
SELECT * FROM t1
WHERE ( t1.c2 = 1 ) OR ( t1.c3 = 'test' ) OR ( t1.c2 = 2 )
order by
case when ( t1.c2 = 1 ) then 1
when ( t1.c3 = 'test' ) then 2
when ( t1.c2 = 2 ) then 3
else 4
end
[/code]

Fabian 24.12.2007 08:35

AW: MySQL: Identifizieren, welche WHERE-Klausel zugeschlagen hat
 
Vielen vielen Dank!

Genau soetwas habe ich gesucht. Welcher der beiden Ansätze wird denn vermutlich schneller sein?

BenniG. 24.12.2007 10:22

AW: MySQL: Identifizieren, welche WHERE-Klausel zugeschlagen hat
 
Ich würde vermuten, dass das UNION schneller ist.
OR-Verknüpfungen sind meist sowieso schon langsamer und eine Sortierung nach einer berechneten "Spalte" kostet nochmal Zeit..

Wenn es um eine zeitkritische Abfrage geht, würde ich mir die Mühe machen und eine große Testtabelle erzeugen.. Sowas >1Mio Datensätze kann MySQL schon ordentlich zum Schwitzen bringen ;)

Manchmal kommen bei "zu wenigen" Datensätzen auch unzuverlässige Ergebnisse, also dann scheint es so, als wäre die eine Abfrage schneller, bei vielen Datensätzen ist diese Abfrage aber dann gähnend langsam.

Fabian 24.12.2007 13:08

AW: MySQL: Identifizieren, welche WHERE-Klausel zugeschlagen hat
 
Hoi ...
wie kann ich denn jetzt doppelte Einträge herausfiltern. Benötige ich dafür wirklich ein Subquery, sprich eine verschachtelte Anfrage.

Was genau meinst du mit einer Testtabelle. Einfach nur mal ausprobieren, was schneller geht, oder wie?

BenniG. 24.12.2007 13:26

AW: MySQL: Identifizieren, welche WHERE-Klausel zugeschlagen hat
 
[quote]Was genau meinst du mit einer Testtabelle. Einfach nur mal ausprobieren, was schneller geht, oder wie?[/quote]
Genau.. Einfach mal ausprobieren und deine Tabelle vorher gut mit Datensätzen füllen..

[quote]wie kann ich denn jetzt doppelte Einträge herausfiltern. Benötige ich dafür wirklich ein Subquery, sprich eine verschachtelte Anfrage.[/quote]
Also normalerweise sollten keine doppelten Einträge vorkommen. Oder hat deine Tabelle sowieso schon doppelte Einträge?
Ein UNION soll laut Manual automatisch ein UNION DISTINCT sein, d.h. Datensätze, auf die zwei Bedingungen zutreffen werden nur einmal angezeigt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:03 Uhr.

Powered by vBulletin® Version 3.8.10 (Deutsch)
Copyright ©2000 - 2020, vBulletin Solutions, Inc.
SEO by vBSEO 3.5.2 ©2010, Crawlability, Inc.