php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 04.12.2010, 11:31  
Benutzer
 
Registriert seit: 14.10.2010
Beiträge: 32
PHP-Kenntnisse:
Anfänger
Elefterios befindet sich auf einem aufstrebenden Ast
Standard Übereinstimmung dem jeweiligen Ergebnis zuordnen, geht das?

Hallo zusammen,

hänge gerade an folgendem Problem, hoffe ihr könnt mir weiterhelfen.

Ich verwende folgende SQL-Abfrage:

Code:
SELECT Spalte1 FROM Tabelle1 
WHERE LEFT (Spalte1, 2) = "au" 
OR LEFT(Spalte1, 3) = "bah"
OR LEFT(Spalte1, 2) = "fa"
ORDER BY Spalte2;
Dieses lass ich mir in php mittels einer Schleife generieren.
Das Problem ist nun, dass ich die Information über die Länge der Übereinstimmung (also bei "au" 2, bei "bah" 3 ...) zum jeweiligen Ergebnis brauche. Also so:

auto -> 2
bahn -> 3
fahrrad -> 2

Wie könnte ich das am geschicktesten anstellen? Geht das überhaupt?

Vielen Dank!
Elefterios ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 04.12.2010, 11:48  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Ja, mit den Kontrollstrukturen IF/CASE kann man sich da sicher was basteln.
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Alt 04.12.2010, 14:16  
Benutzer
 
Registriert seit: 14.10.2010
Beiträge: 32
PHP-Kenntnisse:
Anfänger
Elefterios befindet sich auf einem aufstrebenden Ast
Standard

Super, das das geht ist ja schonmal schön zu hören

Ich kann mir das grad bloß überhaupt nicht vorstellen.
Wie sieht dann die Ausgabe aus?
Hab ich dann ein zusätzliche Spalte, also so:

Wort | Übereinstimmung
auto | 2
bahn | 3
fahrrad | 2

Oder schreib ich mir das direkt an den String dran?

Also so

Wort
auto.2
bahn.3
fahrrad.2

?
Elefterios ist offline   Mit Zitat antworten
Alt 04.12.2010, 14:33  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.266
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Code:
SELECT
  IF (LEFT(Spalte1, 3) = "au", 1, 0) AS au_treffer,
  ..
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 04.12.2010, 15:16  
Benutzer
 
Registriert seit: 14.10.2010
Beiträge: 32
PHP-Kenntnisse:
Anfänger
Elefterios befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Chriz Beitrag anzeigen
Code:
SELECT
  IF (LEFT(Spalte1, 3) = "au", 1, 0) AS au_treffer,
  ..
Danke für die Antwort!

So etwas hatte ich mir auch überlegt Problem ist dann aber:

Ich bekomme in diesem Fall zwei Spalten. Eine für 2 Übereinstimmung und eine für 3 also:

2_treffer | 3_treffer
auto | bahn
fahhrad |

Ich muss aber alle Ergebnis nach der Spalte2 (siehe ersten Beitrag) sortieren. Zum Beispiel nach Geschwindigkeit.

So müsste ich ja dann Spalte 2_treffer und Spalte 3_treffer einzeln auslesen und dann per Hand die beiden Spalten zusammwerfen und komplett sortieren.
Elefterios ist offline   Mit Zitat antworten
Alt 04.12.2010, 15:32  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.266
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Ich würde vorschlagen du erklärst mal was du da überhaupt machst.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 04.12.2010, 16:36  
Benutzer
 
Registriert seit: 14.10.2010
Beiträge: 32
PHP-Kenntnisse:
Anfänger
Elefterios befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Chriz Beitrag anzeigen
Ich würde vorschlagen du erklärst mal was du da überhaupt machst.
also:

Meine Datenbank besteht aus einer einzigen Tabelle mit 3 Spalten.
Die erste Spalte ist die ID, die zweite Spalte der eigentliche Eintrag und die dritte Spalte die Priorität des Eintrags. Generell ist es so, dass ich immer nur die Top 10 Eintrage einer Anfrage verwende.

Nun brauche ich nur die Eintrage aus Spalte2 die (zum Beispiel) mit "au" oder "bah" anfangen.

Wenn ich jetzt sage, gib mir die Top 5 die mit "au" anfangen und die Top 5 die mit "bah" anfangen wäre das falsch. Weil der 6. Eintrag der mit "au" anfängt vielleicht eine höhere Priorität hat als der 1. Eintrag der mit "bah" anfängt. Heißt ich muss die gesamte Tabelle sortieren.

Das ist bis hierher auch nicht weiter schwierig:

Code:
SELECT Spalte2 FROM Tabelle1 
WHERE LEFT (Spalte2, 2) = "au" 
OR LEFT(Spalte2, 3) = "bah"
ORDER BY Priorität;
Mein Problem ist nun, dass ich die Information benötige, wie groß die Übereinstimmung war.

Ich bekomme als Ergebnis mit der obigen Anfrage genau die Top 10 Einträge die ich brauche, habe aber keine Information darüber ob es jetzt 3 Übereinstimmung oder 2 gab, und genau diese Information brauche ich.

Ich habe mir schon so etwas überlegt (nur zum Verständnis, funktioniert aber nicht):

Code:
SELECT CONCAT(a.Spalte2, ".2") FROM Tabelle1 a WHERE LEFT(a.Spalte2, 2) = "au"
UNION
SELECT CONCAT(b.Spalte2, ".3") FROM Tabelle1 b WHERE LEFT(b.Spalte2, 3) = "bah"
ORDER BY a.Priorität, b.Priorität;
Das funktioniert nicht habe mir aber habe mir erhofft das so etwas dabei rauskommt:

auto.2
bahn.3

Da würde dann die Information direkt am String hängen die könnte ich dann verwenden.

Jetzt klarer?
Elefterios ist offline   Mit Zitat antworten
Alt 04.12.2010, 17:29  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.266
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Eigentlich nicht, es gibt doch keine konkurrierenden Einträge, denn was mit "au" anfängt, fängt nicht mit "bah" an?!

Vielleicht verstehe ich dich aber auch immer noch falsch, habe allerdings vor kurzem ein ähnliches Problem gelöst. Es ging um eine Suche, die z.B. "au bah" priorisiert verarbeiten kann, in dem sie prüft ob eine Spalte exakt einem der Werte entspricht (sehr hohe Priorität), damit beginnt (hohe Priorität) oder ob der Begriff darin vorkommt (normale Priorität). Das ganze für alle ausgewählten Spalten und Begriffe.

Du musst dabei wie von mir vorgeschlagen vorgehen - sofern ich deine Intention zumindest richtig verstanden habe:

Code:
SELECT
  IF (LEFT(spalte1, LENGTH("au")) = "au", 1, 0) AS prio_1,
  IF (LEFT(spalte1, LENGTH("bah")) = "bah", 1, 0) AS prio_2,
  IF (LEFT(spalte1, LENGTH("au")) = "au", 1, 0)
  + IF (LEFT(spalte1, LENGTH("bah")) = "bah", 1, 0) AS relevance
FROM
  table
ORDER BY
  IF (LEFT(spalte1, LENGTH("au")) = "au", 1, 0)
  + IF (LEFT(spalte1, LENGTH("bah")) = "bah", 1, 0) DESC
Sieht nach etwas viel if-Bedingungen aus, ist aber - falls du nicht FULLTEXT verwenden willst oder kannst (innoDB) - kaum zu vermeiden (evtl. im relevance beim SELECT). Das Ergebnis erlaubt dir aber genau herauszufinden warum ein Ergebnis so "relevant" bewertet wurde. Es findet übrigens auch weniger relevante Ergebnisse. Falls du das vermeiden möchtest, musst du relevance > 0 in die Bedingung packen.

Wenn du die angesprochene Priorisierung haben möchtest, musst du einen Multiplikator einführen:
Code:
  IF (LEFT(spalte1, LENGTH("au")) = "au", 1, 0) * 1.1
+ IF (LEFT(spalte1, LENGTH("bah")) = "bah", 1, 0) * 1.09
War das in etwa was du gesucht hast?
__________________
"Nuschel ich?" - "Was?"

Geändert von Chriz (04.12.2010 um 17:32 Uhr).
Chriz ist offline   Mit Zitat antworten
Alt 05.12.2010, 00:15  
Benutzer
 
Registriert seit: 14.10.2010
Beiträge: 32
PHP-Kenntnisse:
Anfänger
Elefterios befindet sich auf einem aufstrebenden Ast
Standard

Jetzt wird ja die Spalte3 also die Prioriät komplett unberücksichtigt? Die Sortierung soll nicht nach dem Grad der Übereinstimmung erfolgen, sondern nach einer 3. Spalte die die Priorität des jeweiligen Eintrags angibt.

Meine Tabelle ist so aufgebaut:

ID | Verkehrsmittel | Priorität
1 | Bahn | 2
2 | Auto | 3
3 | Fahrrad | 1
4 | Flugzeug | 5
5 | Schiff | 3

Jetzt möchte ich die Einträge, die mit "F" oder "Ba" anfangen sortiert nach Priorität.

Code:
SELECT Verkehrsmittel FROM Tabelle1 
WHERE (Verkehrsmittel, LENGTH("F")) = "F" 
OR (Verkehrsmittel, LENGTH("Ba")) = "Ba" 
ORDER BY Priorität DESC
Also bekomme ich zurück:

Verkehrsmittel
Flugzeug
Bahn
Fahrrad

Diese Tabelle lese ich jetzt mit PHP aus.

Jetzt habe ich aber das Problem, dass die Information verloren gegangen ist, welcher Teil des Wortes denn übereinstimmt hat.

Also perfekt wäre ein Ergebnis wie:

Verkehrsmittel
Flugzeug 1
Bahn 2
Fahrrad 1

Sorry, hoffe jetzt ist es klar
Elefterios ist offline   Mit Zitat antworten
Alt 05.12.2010, 00:31  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Die Länge deiner „Suchbegriffe“ kennst du vorher, also kannst du sie auch in die Query einbauen.
Dann brauchst du nur noch mit IF entweder diese Zahl zurückliefern, wenn LEFT(...) zutrifft, oder 0 andernfalls - und das für alle Spalten aufsummiern (in der Spaltenliste, und mit AS einen Alias vergeben, unter dem man das dann ansprechen kann).

In der WHERE-Klausel musst du die Bedingungen dabei leider noch mal wiederholen, weil du dort keinen Alias verwenden kannst. (Oder man würde hier ausnahmesweise mal HAVING statt WHERE verwenden, und verlangen dass die oben gebildete Summe größer als 0 sein soll. Das ist generell nicht empfehlenswert [siehe Manual], aber wenn die Tabelle nicht zu umfangreich ist, könnte man da ggf. mal eine Ausnahme machen.)
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

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 an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
nbtstat liefert kein Ergebnis Root-2k PHP Tipps 2010 5 06.06.2010 13:31
Zufallsscript zweimal ausführen und Ergebnis aus erstem Mal ausschließen? Moe LaRoqua PHP Tipps 2010 4 03.06.2010 09:55
[Erledigt] Tabellen Alias im Ergebnis einer Mysqli Abfrage stoffel70 Datenbanken 3 18.05.2010 08:32
Mysql Übereinstimmung von Datensätzen innerhalb einer Tabelle prüfen MrVienna PHP Tipps 2010 13 28.01.2010 17:46
HTML Ergebnis in PHP Variable speichern? joerch PHP Tipps 2009 1 20.12.2009 15:05
weitere if-Abfrage liefert kein Ergebnis evimartin PHP Tipps 2009 11 17.09.2009 13:52
Ergebnis auch bei keinem Treffer der Where-Clause Frank Datenbanken 1 28.08.2009 08:04
SQL-Abfrage bringt nicht das gewünschte Ergebnis vinter PHP Tipps 2009 5 30.05.2009 18:35
[Erledigt] Ergebnis einer externen JavaScript-Funktion mit PHP abfragen? DaraniForces JavaScript, Ajax und mehr 4 26.03.2009 10:33
[Erledigt] Subquery mit ORDER BY ohne Ergebnis stefanjann Datenbanken 8 11.12.2008 10:35
Ergebnis aus Abfrage in Datenbank einfügen BBieniek PHP Tipps 2008 1 11.01.2008 02:51
PHP Auslesung mit PEAR DB ohne Ergebnis Beatbox PHP Tipps 2006 3 20.08.2006 18:36
Oracle decode - Bei Select ohne Ergebnis ? Cyberbob_at_tot Datenbanken 6 09.03.2006 12:04
Zufäliges Ergebnis ermitteln PHP Tipps 2006 1 09.01.2006 16:58
Ergebnis einer DBabfrage in HTML Dateien Suchen u. anzeigen PHP Tipps 2005-2 0 15.08.2005 22:35

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
oracle union spalten zuordnen, 3 übereinstimmungen, 1 ergebnis, php mysqli tabelle mach übereinstimung

Alle Zeitangaben in WEZ +2. Es ist jetzt 11:05 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum