• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

In welchem OR gefunden?

Steffanus

New member
Hallo,

ich frage Daten aus einer Datenbank ab mit "WHERE spalte1='Hund' OR spalte2='HUND'" etc.

Wie kann ich nun herausfinden welche spalte zugetroffen hat? ich könnte den datensatz nun natürliuc auslesen und nochmal alle spalten mit php durchtesten, da es sich aber um sehr viele spalten handelt und mysql ja eigentlich weiss wo es den datensatz gefunden hat muss es mir das doch auch direkt zurückgeben können oder nicht?

gruss
 
Hallo Steffanus,

könntest du uns ein konkretes Beispiel geben? Wie sieht der Input (Tabellenstruktur & Testdaten) aus? Und was soll der Output sein?
 
naja, finds eigentlich schon recht konkret, also Tabelle z.B.:

id rasse1 rasse2 rasse3 stallnummer stadt
------------------------
1 hund pferd esel 5 Hamburg
2 schaf hund katze 8 Dresden

"SELECT stadt FROM tabelle WHERE rasse1='hund' OR rasse2='hund' OR rasse3='hund'"

und jetz will ich halt noch wissen ob es in rasse1, rasse2 oder rasse3 drinstand
 
Code:
SELECT
	stadt,
	IF
	(
		rasse1 = 'hund',
		'rasse1',
		IF
		(
			rasse2 = 'hund',
			'rasse2',
			IF
			(
				rasse3 = 'hund',
				'rasse3',
				''
			)
		)
	) AS fieldname
FROM
	tabelle
WHERE
	rasse1 = 'hund' OR rasse2 = 'hund' OR rasse3 = 'hund'
 
ist ja nur ein beispiel das vom inhalt her nichts mit dem original zu tun hat....

danke curtain, das sieht so aus als ob es eine ganz gute lösung wäre, hast du eine ahnung wie sehr das auf kosten der geschwindigkeit geht? Werds mal austesten aber vielleicht kann das ja jemand schon so abschätzen,
gruss
 
oh ich bin blöd, eigentlich war die frage auf diese weise schon überholt, hab mich länger nich mit dem prolem beschäftigt und vergessen auf welchem stand ich da bin, also meine abfrage sieht gerade so aus (jetzt mal das echte, etwas abgespeckt allerdings, falls das besser gefällt):

PHP:
SELECT

          CASE
          WHEN past1_clean LIKE '$word[$i]' THEN past1_inton
          WHEN past2_clean LIKE '$word[$i]' THEN past2_inton
          WHEN past3_clean LIKE '$word[$i]' THEN past3_inton
          WHEN past4_clean LIKE '$word[$i]' THEN past4_inton
          END AS inton,
          id,
          translation

          FROM words WHERE
          past1_clean='$word[$i]' OR
          past2_clean='$word[$i]' OR
          past3_clean='$word[$i]' OR
          past4_clean='$word[$i]' LIMIT 1

so, eigentlich find ich diese abfrage nicht so glücklich. Denn es wird über WHERE erst gefragt ob in der zeile irgendwo $word vorhanden ist und wenn ja, dann wird noch einmal mit CASE gefragt in welcher Spalte denn nun genau obwohl mysql das ja schon wissen müsste in welcher spalte es das gefunden hat (das ist aber noch ok da ich ja nicht die spalte past1_clean abrufe wenn da was gefunden wurde sondern seinen pendant past1_inton).

So jetzt will ich aber ZUSÄTZLICH noch wissen ob das nun in past1_clean, past2_clean oder vielleicht auch past4_clean gefunden wurde. Theoretisch könnte man das ja in die CASE abfrage mit reinsetzen, also so wie:

PHP:
CASE
WHEN past1_clean LIKE '$word[$i]' THEN fieldname='past1_clean', past1_inton
END AS inton

aber so geht es natürlich nicht von der syntax, und ich weiss nicht ob man das irgendwie richtig schreiben kann?!
 
Du könntest auch ein UNION für die Abfrage nehmen.

Code:
SELECT
	past1_inton AS inton,
	'past1_clean' AS fieldname
FROM
	words
WHERE
	past1_clean = '$word[$i]'
UNION
SELECT
	past2_inton,
	'past2_clean'
FROM
	words
WHERE
	past2_clean = '$word[$i]'
UNION
SELECT
	past3_inton,
	'past3_clean'
FROM
	words
WHERE
	past3_clean = '$word[$i]'

Für die Performance ist vor allem wichtig, dass die Spalten 'past1_clean', 'past2_clean' und 'past3_clean' indiziert sind.
 
ist ja nur ein beispiel das vom inhalt her nichts mit dem original zu tun hat....
Trotzdem sieht das nach ziemlichen gemurkse aus, aber da wir das Orginal nicht kennen können wir uns nur ein Urteil erlauben über das was wir sehen.

danke curtain, das sieht so aus als ob es eine ganz gute lösung wäre, hast du eine ahnung wie sehr das auf kosten der geschwindigkeit geht?
Da könnte EXPLAIN helfen
 
habs mit dem union versucht, abfrage dauert 4malmso lange, autsch.

ich versuch es mal mit zwei CASE abfragen obwohl ich das auch nich so dolle find...

wegen indzierung, die daten sind in UTF8 und da sagt mir mysql immer
#1071 - Specified key was too long; max key length is 1000 bytes

hab bisher sovielrausbekommen können das es an dem zeichensatz liegt, war ja klar, aber wie kann ich denn nun utf8 tabellen indizieren?!
 
wegen indzierung, die daten sind in UTF8 und da sagt mir mysql immer
#1071 - Specified key was too long; max key length is 1000 bytes

hab bisher sovielrausbekommen können das es an dem zeichensatz liegt, war ja klar, aber wie kann ich denn nun utf8 tabellen indizieren?!
Was Dein Index Problem angeht, würde ich mal sagen Du machst was falsch und es liegt nicht am UTF8. Du hast das mit der Indexierung vermutlich falsch verstanden und wolltest alle Spalten à VARCHAR(255) in einen Index packen. Das kann nicht gut gehen und entspricht nicht Deinem Abfrageprofil, was Dir EXPLAIN auch sagen dürfte ("Full Table Scan" ist schlecht).

Ansonsten würde ich echt mal überlegen, ob Du die Tabelle nicht lieber normalisieren solltest.
Außerdem klingt Deine Anforderung etwas merkwürdig. Wenn man einen Treffer hat, dann ist es doch i.d.R. völlig egal wo, man weiß der Datensatz ist betroffen und gut ist das. Vermutlich gibt es irgendeinen diffusen Grund, den wir nicht kennen, und der durch ein besseres Datenmodell vermutlich wesentlich leichter zu behandeln wäre.
 
Zurück
Oben