dani
Goto Top

MySQL - Abfrage über 2 Attribute

Hallo zusammen,
und seinen wunderschönen Tag zum Arbeiten. face-sad

Ich habe eine MySQL-Tabelle die wie folgt aufgebaut ist:
CREATE TABLE IF NOT EXISTS `protection` (
  `id` int(11) NOT NULL auto_increment,
  `tag` varchar(50) NOT NULL,
  `name` char(50) NOT NULL,
  `sid` varchar(50) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Nun habe ich ein Plugin von einer Software, die ein SQL-Statement absetzt und 2 Parameter mit auf den Weg gibt.

1. Parameter wird mit "WHERE sid=" abgefragt
2. Parameter soll mit dem Inhalt der Spalte "tag" verglichen werden. Und zwar dahingehend, dass überprüft werden soll ob das Wort in der Zelle am Anfang des Parameters auftaucht. Beispiel:

Zelle: test
Parameter: test_lauf
Ergebnis: Treffer, Rückgabe von "name".

Ich habe schon einige Abfragen erstellt, aber um frischen Wind reinzubringen poste ich diese mal nicht!
Habt ihr ne Idee?


Grüße,
Dani

Content-Key: 113658

Url: https://administrator.de/contentid/113658

Ausgedruckt am: 29.03.2024 um 05:03 Uhr

Mitglied: maretz
maretz 10.04.2009 um 17:03:26 Uhr
Goto Top
Ich habe schon einige Ideen entwickelt - aber um das nicht langweilig werden zu lassen poste ich die mal nicht...

Wie wärs wenn du erstmal deine Überlegungen zeigst - und wir dann gucken ob man da was verbessern könnte?
Mitglied: dog
dog 10.04.2009 um 18:28:17 Uhr
Goto Top
Naja, da gibt es mehrere Ansätze, abhängig davon wie du den Query erzeugst.

Am leichtesten wäre:

SELECT * FROM protection WHERE tag LIKE 'parameter%'  

ist equiv. zu:

SELECT * FROM protection WHERE tag LIKE CONCAT(parameter,'%')  

Es geht natürlich auch komplizierter:

SELECT *,SUBSTRING(tag FROM 0 FOR CHAR_LENGTH(parameter)) AS comp WHERE parameter = comp

Grüße

Max
Mitglied: Dani
Dani 10.04.2009 um 21:13:05 Uhr
Goto Top
Hi Max,
die Abfrage 1 passt auf mein Problem nicht. Bie der 2. meldet mir phpMyAdmin die Funktion gibt es nicht und die 3. Abfrage versteh nicht. face-smile
Mitglied: Dani
Dani 10.04.2009 um 21:20:34 Uhr
Goto Top
Ich erklär's am Besten noch einmal. face-smile

Ich rufe ein SQL-Abfrage auf - diese bekommt 2 Parameter. Der erste Parameter wird mit der Spalte "sid" verglichen und zwar über " WHERE sid='parameter'!. Das ist nicht das Problem...
Nun soll der 2. Parameter mit der Spalte "tag" verglichen werden und zwar sollen nur soviele Zeichen wie der String der in der Spalte "tag" drin steht.

Beispiel:
In der Spalte "tag" steht "iwus". Der 2. Parameter hat im Moment "iwus|gehas". Da "iwus" eine Länge von 4 hat, nur die ersten 4 Zeichen "iwus|gehas" angeschaut werden.


Grüße,
Dani
Mitglied: dog
dog 10.04.2009 um 23:17:50 Uhr
Goto Top
Ich rufe ein SQL-Abfrage auf - diese bekommt 2 Parameter

Das ist mir nicht präzise genug. face-smile Wo hast du die Abfrage erstellt, wo rufst du sie auf?

Bie der 2. meldet mir phpMyAdmin die Funktion gibt es nicht

Das kann eigentlich nicht sein. CONCAT gibt es schon ab MySQL 3.23

In der Spalte "tag" steht "iwus". Der 2. Parameter hat im Moment "iwus|gehas". Da "iwus" eine Länge von 4 hat, nur die ersten 4 Zeichen "iwus|gehas" angeschaut werden.

Ok, da hab ich dich andersrum verstanden (Nämlich dass die Zelle länger ist als der Parameter). Dann muss die Abfrage natürlich lauten:

SELECT *,SUBSTRING(parameter FROM 0 FOR CHAR_LENGTH(tag)) AS comp WHERE tag = comp

Die anderen beiden kannst du vergessen, die passen nicht face-smile

Grüße

Max
Mitglied: Dani
Dani 11.04.2009 um 01:24:51 Uhr
Goto Top
Hi Max,
die Abfrage wird aus einen Modul eines Programmes gestartet - welches das ist, tut hier nichts zur Sache. Sprich bei einem bestimmten Event wird diese dann generiert und ausgeführt.

DIe Abfrage bringt folgenden Fehler:
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE tag = comp' at line 1  

Grüße,
Dani
Mitglied: dog
dog 11.04.2009 um 01:58:33 Uhr
Goto Top
OK, Sorry ich hatte vergessen, dass MySQL "temporäre Spalten" nicht in WHERE-Klauseln verwenden kann.
Das sollte aber jetzt funktionieren:

SELECT * FROM protection WHERE tag = SUBSTRING(parameter FROM 1 FOR CHAR_LENGTH(tag));

Grüße

Max
Mitglied: Dani
Dani 11.04.2009 um 12:57:55 Uhr
Goto Top
Hi Max,
ich habe als Parameter "siet_test" hinterlegt. Nun erscheint folgende Meldung:
#1267 - Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=' 
Schau ich in meiner Struktur nach, sind alle VARCHAR-Felder in latin1. Ich habe jetzt mal alles auf UTF-8 umgestellt und siehe es geht. face-smile


Grüße,
Dani