Auslesen, in welchem Feld der Treffer steckt

Auslesen, in welchem Feld der Treffer steckt

am 04.04.2007 00:05:00 von Frank Ehrlacher

Hallo,

ich habe eine MySql-Abfrage über mehrere Felder a la

$anfrage="SELECT * FROM abcWHERE Feld1 like '$x' or Feld2 like '$x' or Feld3
like '$x' ... usw. ";

mit
$ergebnis=mysql_query($anfrage)
$zeile_cd=mysql_fetch_row($ergebnis);

bekomme ich dann auch alle betreffenden Felder des gefundenen Datensatzes in
$zeile[0] usw ...

Meine Frage aber - wie erfahre ich, WELCHE Bedingung zum Treffer geführt
hat, bzw. in welchem $zeile[x] nun mein Treffer liegt ...?

(möglichst per MySQL)

Danke für Eure Hilfe !

Frank

Re: Auslesen, in welchem Feld der Treffer steckt

am 04.04.2007 00:35:32 von Siegfried Schmidt

Hallo Frank,

> Meine Frage aber - wie erfahre ich, WELCHE Bedingung zum Treffer
> geführt hat, bzw. in welchem $zeile[x] nun mein Treffer liegt ...?

Die Bedingungen einzeln abfragen und mit einer zusätzlichen Kennung
zusammenfassen:

select 1, feld1 from abc where feld1 like '$x'
union select 2, feld2 from abc where feld2 like '$x'
union select 3, feld3 from abc where feld3 like '$x' usw..



Siegfried
--
http://www.schmidt.ath.cx

Re: Auslesen, in welchem Feld der Treffer steckt

am 04.04.2007 01:02:10 von Kai Ruhnau

Frank Ehrlacher wrote:
> ich habe eine MySql-Abfrage über mehrere Felder a la
>
> $anfrage="SELECT * FROM abcWHERE Feld1 like '$x' or Feld2 like '$x' or
> Feld3 like '$x' ... usw. ";
>
> mit
> $ergebnis=mysql_query($anfrage)
> $zeile_cd=mysql_fetch_row($ergebnis);
>
> bekomme ich dann auch alle betreffenden Felder des gefundenen
> Datensatzes in $zeile[0] usw ...
>
> Meine Frage aber - wie erfahre ich, WELCHE Bedingung zum Treffer geführt
> hat, bzw. in welchem $zeile[x] nun mein Treffer liegt ...?
>
> (möglichst per MySQL)

Indem du die Bedingungen auch in die Feldliste schreibst:

SELECT
...
Feld1 like '$x' AS feld1bedingung,
Feld2 like '$x' AS feld2bedingung,
...
FROM ...

Oder wie Frank schrieb, die Einzelabfragen in UNIONs auslagerst.
Welche Variante schneller ist, hängt von mehreren Faktoren ab.

Wenn du in dieser Art allerdings vorhast, eine Suche über "alle" Felder
zu implementieren, dann lass' das lieber und mache für jedes Feld eine
eigene Eingabemöglichkeit. Deine Benutzer wissen üblicherweise, wonach
sie suchen und die Amazon-"Suche" auf der anderen Seite ist einfach nur
furchtbar...

Grüße
Kai

--
This signature is left as an exercise for the reader.

Re: Auslesen, in welchem Feld der Treffer steckt

am 04.04.2007 19:06:14 von Frank Ehrlacher

Hallo Kai,
Danke für die Idee - ich krieg sie nur noch nicht ganz umgesetzt.

Vielleicht liegt es auch daran, dass das "SELECT ... AS" im MySQL-Tutorial
anscheinend nicht (oder versteckt?) dokumentiert ist und ich kein
Praxisbeispiel finde...
Wie "sollte" die Abfrage dann komplett aussehen?

a) SELECT Feld1 from abc where Feld1 like '$x' AS feld1bedingung, Feld2
from abc where Feld1 like '$x' AS feld2bedingung, ...
oder
b) SELECT * from abc where Feld1 like '$x' AS feld1bedingung, Feld2 like
'$x' AS feld2bedingung, ...

und - was habe ich nachher in der Variable (oder dem Array?) feld1bedingung
oder feld2bedingung stehen ...?

Vielleicht mal das konkrete Beispiel:
Ich habe eine Tabelle mit 10 CD-Alben und deren Tracks
(Albumtitel und Interpret stehen in einer anderen Tabelle)

Bsp:
Datensatz 1: ID, Track01, Track02, Track03 ... Track 15
Datensatz 2: ID, Track01,....; Track 13

Der User soll nun einen Songtitel (oder Teile daraus) eingeben und die
Datenbank soll suchen, auf welcher CD (= in welchem Datensatz) dieser Titel
enthalten ist.
Das funktioniert auch - ich übergebe, die ID aus $zeile[0] an die andere
Tabelle und er liefert mit Albumname etc...

ZUSÄTZLICH will ich aber noch angezeigt haben, in welchem (Track) nun der
Suchbegriff vorkommt. Das "sagt" mir MySQL allerdings nicht - ich habe
natürlich in den Feldern $zeile[1] ... $zeile[13] alle Tracks des
betreffenden Albums stehen - aber welcher nun der "gesuchte" ist, müsste ich
via PHP filtern, das befriedigt mich noch nicht ...

Ich hoffe, ich habe mich verständlich, aber nicht zu naiv (bin Newbie bzw.
"Quartals-SQLer") ausgedrückt.

Danke und Grüße

Frank

Re: Auslesen, in welchem Feld der Treffer steckt

am 04.04.2007 19:42:46 von Frank Ehrlacher

Hallo Siegfried,
Danke für die Antwort - aber wenn ich das richtig verstehe, ist es nicht
das, was ich will ...
Wenn ich Deine Anfrage richtig lese, sucht er sich dann ggf. feld1, feld2
.... aus verschiedenen Datensätzen, ja?
Ich will aber im Gegenteil dann in einem Array nur DAS Feld gefüllt haben,
wo der "treffer" drinsteckt - oder "idealerweise" noch eine Art Poínter der
mir sagt "bedingung3 führte zum treffer, feld3 ist gefüllt" ... aber für
jeden Treffer innerhalb eines Datensatzes in den Ergebnis-Rows ein eigenes
Array ...
Ich hoffe, Du verstehst, was ich meine?
Danke
Frank
"Siegfried Schmidt" schrieb im Newsbeitrag
news:krkuue.oqs.ln@shiva.my-fqdn.de...
> Hallo Frank,
>
>> Meine Frage aber - wie erfahre ich, WELCHE Bedingung zum Treffer
>> geführt hat, bzw. in welchem $zeile[x] nun mein Treffer liegt ...?
>
> Die Bedingungen einzeln abfragen und mit einer zusätzlichen Kennung
> zusammenfassen:
>
> select 1, feld1 from abc where feld1 like '$x'
> union select 2, feld2 from abc where feld2 like '$x'
> union select 3, feld3 from abc where feld3 like '$x' usw..
>
>
>
> Siegfried
> --
> http://www.schmidt.ath.cx

Re: Auslesen, in welchem Feld der Treffer steckt

am 04.04.2007 21:10:26 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Auslesen, in welchem Feld der Treffer steckt

am 04.04.2007 21:19:54 von Siegfried Schmidt

Hallo Frank,

> Ich will aber im Gegenteil dann in einem Array nur DAS Feld gefüllt
> haben, wo der "treffer" drinsteckt - oder "idealerweise" noch eine Art
> Poínter der mir sagt "bedingung3 führte zum treffer, feld3 ist
> gefüllt" ...

Die Ergebnismenge der Abfrage hat zwei Spalten, die erste liefert die
gewünschte Kennung welches Feld den Treffer hatte und die zweite liefert
den dazugehörenden Feldinhalt.

> aber für jeden Treffer innerhalb eines Datensatzes in den
> Ergebnis-Rows ein eigenes Array ...
> Ich hoffe, Du verstehst, was ich meine?

Wenn in einem Datensatz Feld1, Feld2 und Feld3 die Bedingung erfüllen
liefert die Abfrage 3 Zeilen:
1, feld1
2, feld2
3, feld3

Aus meiner Sicht passt das perfekt zu deinen Anforderungen.


BTW: es ist für das Verständis besser, SQL-Probleme aus der SQL-Sicht
abzuhanden. In welcher Struktur die Ergebnismenge abgeholt wird spielt
dabei keine Rolle.


Siegfried
--
http://www.schmidt.ath.cx

Re: Auslesen, in welchem Feld der Treffer steckt

am 04.04.2007 23:36:25 von Frank Ehrlacher

Hallo Siegfried,

Danke für Deinen Tipp - ich dachte, ich hätte ihn korrekt umgesetzt - werde
aber mit einem "You have an error in your SQL syntax ..." abgestraft.

Meine Abfrage sieht vereinfacht so aus:
(select 01, verbindungsfeld, song01 from songs where song01 LIKE '%abcde%')
union
(select 02, verbindungsfeld, song02 from songs where song02 LIKE '%abcde%')
union
(select 03, verbindungsfeld, song03 from songs where song03 LIKE '%abcde%')

Als SQL-Fehlermeldung erhalte ich:
Fehlermeldung=You have an error in your SQL syntax near '(select 01,
verbindungsfeld, song01 from songs where song01 LIKE '%abcde' at line 1

Die mir mutmaßlichen Fehlerquellen habe ich ausgeschlossen (z.B. das "01"
oder falsche Feldbezeichner), habe es auch mit und ohne "(" Klammern
probiert und nachdem ich mich ein bisschen eingelesen hatte auch mit "select
01 as sort_col ..."

Wo liegt mein Fehler? Wahrscheinlich jetzt ein Deppenfehler...

Danke!

Frank

"Siegfried Schmidt" schrieb im Newsbeitrag
news:qot0ve.nn1.ln@shiva.my-fqdn.de...
> Hallo Frank,
>
>> Ich will aber im Gegenteil dann in einem Array nur DAS Feld gefüllt
>> haben, wo der "treffer" drinsteckt - oder "idealerweise" noch eine Art
>> Poínter der mir sagt "bedingung3 führte zum treffer, feld3 ist
>> gefüllt" ...
>
> Die Ergebnismenge der Abfrage hat zwei Spalten, die erste liefert die
> gewünschte Kennung welches Feld den Treffer hatte und die zweite liefert
> den dazugehörenden Feldinhalt.
>
>> aber für jeden Treffer innerhalb eines Datensatzes in den
>> Ergebnis-Rows ein eigenes Array ...
>> Ich hoffe, Du verstehst, was ich meine?
>
> Wenn in einem Datensatz Feld1, Feld2 und Feld3 die Bedingung erfüllen
> liefert die Abfrage 3 Zeilen:
> 1, feld1
> 2, feld2
> 3, feld3
>
> Aus meiner Sicht passt das perfekt zu deinen Anforderungen.
>
>
> BTW: es ist für das Verständis besser, SQL-Probleme aus der SQL-Sicht
> abzuhanden. In welcher Struktur die Ergebnismenge abgeholt wird spielt
> dabei keine Rolle.
>
>
> Siegfried
> --
> http://www.schmidt.ath.cx

Re: Auslesen, in welchem Feld der Treffer steckt

am 05.04.2007 09:19:55 von Kai Ruhnau

Frank Ehrlacher wrote:
> Danke für die Idee - ich krieg sie nur noch nicht ganz umgesetzt.

Welche Idee? --> http://learn.to/quote

> Vielleicht liegt es auch daran, dass das "SELECT ... AS" im
> MySQL-Tutorial anscheinend nicht (oder versteckt?) dokumentiert ist und
> ich kein Praxisbeispiel finde...

http://dev.mysql.com/doc/refman/5.0/en/select.html beschreibt die
Verwendung von Aliasen.

> Wie "sollte" die Abfrage dann komplett aussehen?
>
> a) SELECT Feld1 from abc where Feld1 like '$x' AS feld1bedingung, Feld2
> from abc where Feld1 like '$x' AS feld2bedingung, ...
> oder
> b) SELECT * from abc where Feld1 like '$x' AS feld1bedingung, Feld2 like
> '$x' AS feld2bedingung, ...

Du hast das kleine Wörtchen "auch" in meiner Antwort überlesen.
Die Bedingungen sollen zusätzlich zum WHERE auch nochmal in der
SELECT-Liste erscheinen.
Also

SELECT
Feld1,
Feld1 like '$x' AS feld1bedingung,
Feld2,
Feld2 like...
FROM abc
WHERE
Feld1 like '$x'
OR Feld2 like ...

> und - was habe ich nachher in der Variable (oder dem Array?)
> feld1bedingung oder feld2bedingung stehen ...?

Keine Ahnung, probier's aus. Aber...

> Vielleicht mal das konkrete Beispiel:
> Ich habe eine Tabelle mit 10 CD-Alben und deren Tracks
> (Albumtitel und Interpret stehen in einer anderen Tabelle)
>
> Bsp:
> Datensatz 1: ID, Track01, Track02, Track03 ... Track 15
> Datensatz 2: ID, Track01,....; Track 13
>
> Der User soll nun einen Songtitel (oder Teile daraus) eingeben und die
> Datenbank soll suchen, auf welcher CD (= in welchem Datensatz) dieser
> Titel enthalten ist.
> Das funktioniert auch - ich übergebe, die ID aus $zeile[0] an die andere
> Tabelle und er liefert mit Albumname etc...
>
> ZUSÄTZLICH will ich aber noch angezeigt haben, in welchem (Track) nun
> der Suchbegriff vorkommt. Das "sagt" mir MySQL allerdings nicht - ich
> habe natürlich in den Feldern $zeile[1] ... $zeile[13] alle Tracks des
> betreffenden Albums stehen - aber welcher nun der "gesuchte" ist, müsste
> ich via PHP filtern, das befriedigt mich noch nicht ...


Dein Datenbankmodell ist kaputt.
Was tust du,wenn eine CD 25 Titel hat?
Was, wenn es 30, 40 oder 50 sind?
Das Problem hier, dass du Daten (die Track-Nummer) in den Spaltennamen
speicherst.

Du musst dich dringend über Normalisierung informieren. In einer
normalisierten Datenbank, ist deine Abfrage und das gewünschte Ergebnis
ein absoluter Klacks, da du unteranderem die Track-Nummer im Datensatz
speicherst und sie direkt abfragen kannst.

SELECT tracks.titel, track.nummer
FROM alben
INNER JOIN tracks ON tracks.ID_alben=alben.ID
WHERE tracks.title LIKE '$x'

> Ich hoffe, ich habe mich verständlich, aber nicht zu naiv (bin Newbie
> bzw. "Quartals-SQLer") ausgedrückt.

Warum benutzt du keine fertige Lösung, die es massenweise im Internet gibt?

Grüße
Kai

Re: Auslesen, in welchem Feld der Treffer steckt

am 05.04.2007 09:26:14 von Johannes Vogel

Hallo Siegried

Als erstes liest du am Besten http://www.learn.to/quote.

Frank Ehrlacher wrote:
> Danke für Deinen Tipp - ich dachte, ich hätte ihn korrekt umgesetzt -
> werde aber mit einem "You have an error in your SQL syntax ..." abgestraft.
>
> Meine Abfrage sieht vereinfacht so aus:
> (select 01, verbindungsfeld, song01 from songs where song01 LIKE '%abcde%')
> union
> (select 02, verbindungsfeld, song02 from songs where song02 LIKE '%abcde%')
> union
> (select 03, verbindungsfeld, song03 from songs where song03 LIKE '%abcde%')
>
> Als SQL-Fehlermeldung erhalte ich:
> Fehlermeldung=You have an error in your SQL syntax near '(select 01,
> verbindungsfeld, song01 from songs where song01 LIKE '%abcde' at line 1
>
> Die mir mutmaßlichen Fehlerquellen habe ich ausgeschlossen (z.B. das
> "01" oder falsche Feldbezeichner), habe es auch mit und ohne "("
> Klammern probiert und nachdem ich mich ein bisschen eingelesen hatte
> auch mit "select 01 as sort_col ..."
>
> Wo liegt mein Fehler? Wahrscheinlich jetzt ein Deppenfehler...

Vielleicht verwendest du eine uralte MySQL-Version?
Zweite Variante ist, dass dein String, den du an MySQL sendest vorher
schon gefüllt war und du nur erweiterst. Das ist aber kein MySQL,
sondern ein PHP-Problem, weshalb du hier falsch wärst. Mach einfach mal

$sql = "(select 01 ....\n";
$sql.= "union\n";
$sql.= "(select 02 ...\n";
....
mysql_query($sql); if (mysql_errno()) exit ($sql.mysql_error());

HTH, Johannes

PS: Und wenn du jetzt http://www.learn.to/quote immer noch nicht gelesen
hast, solltest du's schnell nachholen.

Re: Auslesen, in welchem Feld der Treffer steckt

am 05.04.2007 14:56:11 von Siegfried Schmidt

Hallo Frank,


> Wo liegt mein Fehler?

Vielleicht eine zu alte mySQL-Version?

Allerdings ist das für deinen Zweck nicht mehr als eine Krücke, denn mit
einer geeigneten Tabellenstruktur löst sich das Problem in Luft auf. Ändere
die Feldstruktur auf einen Song pro Datensatz und du hast direkt das
gewünschte Ergebnis.



Siegfried
--
http://www.schmidt.ath.cx