• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

sql-Abfrage, wie einen Datensatz selektieren, falls es ihn gibt, sonst einen anderen?

  • Ersteller killerchicken_inaktiv
  • Erstellt am

killerchicken_inaktiv

Guest
Sorry fuer den schlechten Titel, faellt bissle schwer kurz zusammenzufassen was ich machen moechte. Ich hab eine Tabelle, da gibts ein Feld, in dem IDs (Fremdschluessel) stehen. Weiterhin gibts ein weiteres Feld mit Strings, und ich moechte nun eine Abfrage finden, mit der ich genau den Datensatz finde, der eine bestimmte ID und einen String findet, wenn es keinen passenden Datensatz dazu gibt, den Datensatz mit derselben ID mit einem default-String (da ist garantiert, dass es den gibt) zurueckgibt.

Ich hoffe, dass war jetzt nicht zu verworren... also ich mach hier mal ein Beispiel:

Code:
ID                                              String
1                                                default
1                                                test
2                                                default

Wenn ich jetzt eine Abfrage mache, in der ich den Datensatz mit ID = 1 und String = test will, soll genau dieser zurueckgegeben werden (und zwar auch nur dieser), wenn ich die gleiche Abfrage auf ID = 2 ausfuehre soll der default zurueckgegeben werden

Liebe Gruesse und herzliches Danke
Sebastian
 
Mitglied seit
02.08.2002
Beiträge
2.781
Reaktionen
0
das was mir einfallen würde wäre sowas wie

SELECT *, (String == "default") as sorting FROM table WHERE id = 2 ORDER BY sorting LIMIT 1

bin mir allerdings nicht sicher, ob das überhaupt funktioniert (und performant ist es bestimmt auch nicht). wieso machste die fallunterscheidung nicht einfach im programm?
 

killerchicken_inaktiv

Guest
Weil das ein recht haeufig vorkommendes Query mit hohem Payload ist, und wenn es eine performante Moeglichkeit gibt, das direkt die engine machen zu lassen, mir das lieber waere

Gruss
Sebastian

PS: Das ganze sollte MySQL-Kompatibel sein, hab ich vergessen zu posten, sorry.
 

RRA^StArFiRe

Guest
was ist der primärschlüssel in deiner tabelle?
ID und String sind nicht unique.

sollten (ID, String) unique sein...
na dann schau dir mal die ablaufsteuerung an.
http://dev.mysql.com/doc/refman/5.1/de/control-flow-functions.html

weiß allerding nicht, ob man als value auch select statements verwenden kann.
und ob es nicht effizienter im programm die unterscheidung zu machen...
mit ner sql-db könntest dir n trigger basteln.
 
Mitglied seit
03.08.2002
Beiträge
3.257
Reaktionen
14
SELECT String, ABS(STRCMP(String,"test")) AS sorting FROM table
WHERE (ID = 1 AND String = 'test')
OR (ID = 1 AND String = 'default')
ORDER BY sorting ASC
LIMIT 0,1

so evtl...

Erklärung:

STRCMP liefert Werte -1, 0 , 1.
0 = Selber string, 1 = String ist größer, -1 = String ist kleiner.
Also das Zeug ABS'en, dass nur 0 und 1 bei rauskommt und ASC sortieren.

Geht aber bestimmt auch noch geschmeidiger. ;)

Edit:
Sehe gerade WHERE / OR kann man natürlich auch anders gestalten

WHERE ID = 1 AND (String = "test" OR String = "default")

oder

WHERE ID = 1 AND String IN ("test","default")

weiss da jetzt auch gerade nicht, was das performanteste ist, vermutlich wird aber STRCMP eh 95% der Rechenzeit benötigen.
 

killerchicken_inaktiv

Guest
@ BiBaButzemann: Danke fuer die kreative Idee, wie flink ich mit AS sorting zurecht komme muss ich mal schauen :)

und ja, ID + String sind Primaerschluessel @ Starfire. Wie wuerdest du den Trigger basteln?

@ amrio: 2 Tabellen? Wie sollte da deiner Meinung nach ein Join aussehen?
 

RRA^StArFiRe

Guest
fügst einfach n weiteres attribut zur tabelle hinzu.
einfach ne spalte vom typ number und nullable, dann ändert das an dem vorherigen ablauf nichts.
noch 2 trigger hinzufügen, einma fürn insert, wo der halt für den neuen eintrag ne "1" in die extraspalte einträgt und den wert vom default (und den anderen spalten derselben ID) +1.
und einma fürn delete, wo der bei den anderen ID´s in der extraspalte -1 durchführt.
somit kannste ganz easy nach den IDs filtern und sortieren.

wenn deine tabelle schon mehrere einträge enthält, musste natürlich erstmal zur initialisierung n anderen trigger einstelln, der da werte reinmacht. aber kA inwiefern sich die defaultstrings von den teststrings unterscheiden und wie die sich identifizieren lassen, oder obs mehrere teststrings geben kann.
oder initialisierst alles von hand.
 
Mitglied seit
02.08.2002
Beiträge
2.781
Reaktionen
0
jo ne einfache möglichkeit sollte vielleicht einfach sein, in ner dritten spalte mit zu kodieren, ob es sich um eine default spalte, oder halt ne andere handelt (dann kannste die abfrage von biba oder mir einfacher gestalten)
 
Oben