Antwort
 
LinkBack Themen-Optionen Thema durchsuchen
Alt 12.01.2009, 20:20 Nach oben    #1
Erfahrener Benutzer
 
Registriert seit: 16.08.2008
Ort: Mecklenburg-Vorpommern
Beiträge: 314
Standard Dynamischer MySQL-Query in MySQL

Guten Abend Entwicklergemeinde,

nachdem ich heute und gestern längere Zeit im Internet gesucht habe, muss ich leider enttäuscht feststellen, dass zu meinem Thema keine - für mich - brauchbaren Informationen gefunden werden konnten.

Da ich das Problem am besten anhand eines Code-Beispieles darstellen kann, versuche ich das mal folgendermaßen:

Code:
SELECT ID, Name FROM table1 WHERE Funktion(Input wird aus Spalte der aktuellen Zeile geholt) = $string
Ich möchte, dass aus "table1" die ID sowie der Name herausgesucht werden, bei denen die Funktion, gefüttert mit Daten aus der aktuellen Spalte der Zeile einen Treffer auf $string verbucht.

In der Tabelle steht zum Beispiel
ID, Name, String
0, Otto, Achsachmawaddamahaadrann
1, Anton, Anton

Dann lautet der SQL Befehl

Code:
SELECT ID, Name FROM table1 WHERE Funktion(Achsachmawaddamahaardrann) = $string;
und für die nächste Zeile


Code:
SELECT ID, Name FROM table1 WHERE Funktion(Anton) = $string;
Der Query würde also für jede Zeile etwas anders lauten - MySQL soll das selbstständig umsetzen, völlig dynamisch.

Das Ganze habe ich natürlich in PHP bereits am Laufen, allerdings finde ich den Umstand ärgerlich, dass ich zu aller erst einmal alle Datenzeilen der Spalte "String" in ein PHP Array übergebe, durch eine Funkion jage und dann via preg_match z.B. Vergleiche, ob in $string der (bearbeitete) Inhalt aus der Datenspalte gefunden wurde und dann die dazugehörige ID und Name in ein anderes Array speichere.

Warum soll ich alle Tabelleninhalte von MySQL nach PHP transportieren, wenn mich nur zwei Datenzeilen interessieren?

Die Problematik an sich ist ja eigentlich nur, dass ich nicht nicht nachschauen will, ob der Inhalt der Spalte "String" = $string ist, sondern ob das Ergebnis der Funkion "Funkion(Spalte "String" der AKTUELLEN Zeile)" auf $string passt.

Ich vermute, dass eine Methode, die so arbeitet, wie ich mir das gerade denke, performanter wäre, als die PHP-Variante.

Für Denkanstöße (und vor allem Referenzen oder Beispiele) wäre ich sehr, sehr dankbar!

Gruß

Geändert von Sekundentakt (12.01.2009 um 20:49 Uhr)
Sekundentakt ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.01.2009, 12:29 Nach oben    #2
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.365
Standard

Ich vermute das wird dir nicht gefallen, könnte aber die einzige Lösung sein...
http://dev.mysql.com/doc/refman/6.0/en/adding-udf.html

Jedenfalls wenn ich dich richtig verstanden habe.
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.01.2009, 14:41 Nach oben    #3
Erfahrener Benutzer
 
Registriert seit: 16.08.2008
Ort: Mecklenburg-Vorpommern
Beiträge: 314
Standard

Hi Pago,

was du mir da rausgesucht hast, bedeutet für mich, wenn ich es richtig übersetzt habe, dass ich eigene C++/C-Funktionen schreiben muss, die quasi das tun, was ich will?

Sprich: ein Select in der Select-Abfrage, der statt der gesamten Tabelle, den aktuellen Datensatz der Spalte XY einsetzt, gibt es nicht (deines Wissensstandes nach)?

Interessant wäre es ja, so etwas zu gestalten, doch C++ ist mir derzeit noch fremd.

Trotzdem danke!
Gruß
Sekundentakt ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.01.2009, 14:59 Nach oben    #4
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.365
Standard

Die Frage dabei ist ja, was deine "FUNKTION" eigentlich macht. MySQL hat einige Funktionen eingebaut, wenn du die verwenden kannst, solltest du das tun. Wenn nicht bleibt dir nur die Möglichkeit, über C/C++ eine Erweiterung zu schreiben, oder die Rechnung nach PHP zu verlagern.
Hängt aber wie gesagt davon ab, was die Funktion machen soll. Wenn du uns das sagen könntest, könnten wir dir vielleicht sagen, ob und wie du das mit MySQL-Mitteln umsetzen kannst.
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.01.2009, 15:13 Nach oben    #5
Erfahrener Benutzer
 
Registriert seit: 16.08.2008
Ort: Mecklenburg-Vorpommern
Beiträge: 314
Standard

Ich möchte z.B. das MySQLs Funktion für reguläre Ausdrücke einen Ausdruck aus der aktuellen Datenzeile in der Spalte "String" ausliest, und mit $string vergleicht. Wenn der Ausdruck der aktuellen Datenzeile auf $string passt, dann soll diese Zeile zurückgeliefert werden.
Sekundentakt ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.01.2009, 15:20 Nach oben    #6
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.365
Standard

http://www.regular-expressions.info/mysql.html
Da ist'n Beispiel, wie das gehen würde.
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.01.2009, 15:41 Nach oben    #7
Erfahrener Benutzer
 
Registriert seit: 16.08.2008
Ort: Mecklenburg-Vorpommern
Beiträge: 314
Standard

Hmm, ich habe mir das jetzt wirklich mehrmals durchgelesen, konnte aber nichts entsprechendes finden.

Der RegExp ist in der Spalte "String" abgelegt.
Dann soll MySQL folgendes matchen:
Code:
SELECT ... WHERE REGEXP('Spalte-Strings Inhalt') = $string
Steht in der aktuellen Zeile in der Spalte String "/regexp/i" dann lautet der Code (sinngemäß)

[/FONT]
Code:
SELECT ... WHERE REGEXP('/regexp/i') = $string
Der $string würde hierbei aus einem Formular stammen, der reguläre Ausdruck aber aus einer Tabellenspalte. Mit anderen Worten: Konstant bleibt der String, nicht aber der reguläre Ausdruck.

Geändert von Sekundentakt (13.01.2009 um 15:51 Uhr)
Sekundentakt ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.01.2009, 15:55 Nach oben    #8
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.365
Standard

Stimmt. Okay... also entweder es geht so:
Code:
WHERE $string RLIKE column
oder du wirst wirklich den C++-Weg nehmen müssen. Finde jedenfalls auf die schnelle nichts passendes.
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.01.2009, 16:16 Nach oben    #9
Erfahrener Benutzer
 
Registriert seit: 16.08.2008
Ort: Mecklenburg-Vorpommern
Beiträge: 314
Standard

Zitat:
Zitat von pago Beitrag anzeigen
Stimmt. Okay... also entweder es geht so:
Code:
WHERE $string RLIKE column
oder du wirst wirklich den C++-Weg nehmen müssen. Finde jedenfalls auf die schnelle nichts passendes.
Bist du dir wirklich sicher, dass du RLIKE richtig verwendest?
Meine MySQL Datenbank haut bei folgendem Befehl

Code:
SELECT * FROM `tabletest` WHERE "Test 1234 test" RLIKE `String`
nämlich keine Ergebnisse zurück und behandelt `String` als Pattern.

Schade, dann wird das wohl nichts.

Trotzdem Danke für die Hilfe.
Sekundentakt ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.01.2009, 18:27 Nach oben    #10
Erfahrener Benutzer
 
Registriert seit: 16.08.2008
Ort: Mecklenburg-Vorpommern
Beiträge: 314
Standard

Hier mal ein Gedanke:

Code:
SELECT * FROM `table1` WHERE '$suchstring' RLIKE (SELECT `String` FROM `table1`)
Allerdings liefert er mir hierbei kein Ergebnis zurück, obwohl $suchstring vom RegExp gefunden hätte werden müssen.

Wenn ich beim RegExp keine "Befehlszeichen" wie für Regular Expressions üblich verwende, sondern nur das reine Wort verwende, dann funktioniert es.

Also z.B. wird im $suchstring "Hans du hast das Auto geklaut" mit RLIKE (SELECT entspricht "\sAuto\s/i") gesucht, findet er nichts, lautet der Spalteninhalt allerdings nur "Auto" und nicht "\sAuto\s/i" findet er die entsprechenden Zeilen.

Nun sind diese "Befehlszeichen" allerdings sehr wichtig - hat jemand ne Idee warum es nicht funktionieren könnte?

Übrigens: Ersetze ich die \s durch z.B. [:space:], dann macht das keinen Unterschied!
Ich habe bisher noch nicht gehört, das \s berücksichtigt bzw. nicht berücksichtigt werden, sollte aber letzters zutreffen: die Alternative hat auch keine Wirkung.

Geändert von Sekundentakt (13.01.2009 um 18:57 Uhr)
Sekundentakt ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.01.2009, 21:29 Nach oben    #11
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.365
Standard

Auf der Seite, die ich verlinkt habe, steht folgender Absatz:
Zitat:
MySQL does not offer any matching modes. POSIX EREs don't support mode modifiers inside the regular expression, and MySQL's REGEXP operator does not provide a way to specify modes outside the regular expression. The REGEXP operator always applies regular expressions case insensitively, the dot matches all characters including newlines, and the caret and dollar only match at the very start and end of the string. In other words: MySQL treats newline characters like ordinary characters.
Heißt: Wahrscheinlich ist das /i das Problem. Versuch's mal ohne.
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.01.2009, 09:05 Nach oben    #12
Erfahrener Benutzer
 
Registriert seit: 16.08.2008
Ort: Mecklenburg-Vorpommern
Beiträge: 314
Standard

Nein, dass funktioniert leider auch nicht.
Das Problem lag aber auch nicht am RegExp, sondern daran, dass er an der Stelle von $suchstring eine Tabellenspalte erwartet, bei der letzten Variante von mir meckert er dann zusätzlich noch rum, wenn die SELECT-Abfrage mehr als ein Argument zurückliefert - somit hat sich das Thema, C++ außen vor gelassen, erledigt.


Trotzdem danke!
Sekundentakt ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Dynamische mySQL Query la-finest PHP-Programmierung 2 25.01.2007 16:36
Auslesen zweier verschiedener Datensätze in einem Query (mySQL) Chr!s Datenbanken 8 14.11.2006 19:57
MySQL Fehlermeldung: Your query requires a full tablescan ... Chr!s Datenbanken 12 31.07.2006 21:45
MySQL Query wird nicht ausgeführt Garnele Datenbanken 6 01.04.2006 03:17
MySQL 5.1 kommt in die Beta-Phase Ben Nachrichten 1 02.03.2006 14:31


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 Uhr.


Powered by vBulletin® Version 3.8.4 (Deutsch)
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.3.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47