php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 18-03-2009, 18:30
Luki
 Registrierter Benutzer
Links : Onlinestatus : Luki ist offline
Registriert seit: Mar 2006
Ort: Schweiz
Beiträge: 13
Luki ist zur Zeit noch ein unbeschriebenes Blatt
Unhappy Kleines Problem mit einem Suchfilter (LEFT JOIN)

Hallo zusammen,

ich habe hier ein kleines Problem mit einem Suchfilter, welcher nur suboptimal funktioniert. Ich habe eine Projektbezogene Bilddatenbank erstellt. In deser gibt es die Möglichkeit, Bilder nach spezifischen Kriterien zu filtern. Es funktionieren eigentlich auch alle Filter. Bei der SUche nach Schlüsselwürtern gibt es aber noch ein keines Problem. Wenn ich nur einen Schlüsselwort Filter verwende, klappts problemlos. Suche ich jedoch noch nach einem zweiten Schlüsselwort, dann wirds nichts mehr.

EDIT: Ich arbeite mit MySQL 6.0

Meiner Funktion wird ein Array mit den abzufragenden BildIDs mirgegeben. Hier mal eine Beispielabrrage welche genereirt wird, wenn der User nach zwei Schlüsselwörtern sucht ohne dabei weitere Filter zu verwenden.

PHP-Code:
SELECT imagesdb_images.imageID FROM imagesdb_images 
LEFT JOIN imagesdb_connections ON imagesdb_images
.imageID imagesdb_connections.destination 
LEFT JOIN imagesdb_project ON imagesdb_images
.projektID imagesdb_project.projectID 
LEFT JOIN imagesdb_locations ON imagesdb_project
.locationID imagesdb_locations.locationID 
WHERE 
(imagesdb_bilder.imageID=462 OR imagesdb_images.imageID=463 OR ....) 
AND (
imagesdb_images.imageID 
imagesdb_connections.destination AND imagesdb_connections.source =OR imagesdb_images.imageDescription LIKE "%Brot%"
AND (
imagesdb_images.imageID 
imagesdb_connections.destination AND imagesdb_connections.source =OR imagesdb_images.imageDescription LIKE "%Wasser%"
Hier die für die Abpfrage relevanten Tabellen:

imagesdb_connections:

Feld | Typ | NULL
-------------------------------
source | int(50) | NO |
destination | int(50) | NO |
type | varchar(50) | NO |


Beispiel Datensatz: Source=1 (KeywordID), Destination=462 (ImageID) type="keyword" (Beziehungstyp)
In dieser Tabelle wird definiert, welche Schlüsselwörter mit welchen bildern in Verbindung stehen.

imagesdb_keywords:

| Feld | Typ |NULL |Attr| Extra |
-----------------------------------------
| wordID | int(50) | NO | PRI |auto_increment |
| word | varchar(100) | YES | | |



imagesdb_images:

| Feld | Typ |NULL |Attr| Extra
------------------------------------------
| imageID | int(10) unsigned | NO | PRI | NULL | auto_increment |

| imageName | varchar(20) | YES |

| imagePath | int(50) | YES |

| imageDescription | varchar(300) | YES |

| projectID | int(10) | YES |

| categoryID | int(11) | YES |

| DateInserted | varchar(50) | YES |

| DateUpdated | varchar(50) | YES |



Meine Erfahrunf mit komplexeren Abfragen lässt halt ein wenig zu wünschen übrig. Aber es kommt ja auch nicht alles von heute auf morgen.

Ich hoffe ihr könnt mir helfen.

Grüsse und danke
Luki

Geändert von Luki (18-03-2009 um 18:35 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 18-03-2009, 18:57
case
 Registrierter Benutzer
Links : Onlinestatus : case ist offline
Registriert seit: Mar 2007
Beiträge: 265
case ist zur Zeit noch ein unbeschriebenes Blatt
case eine Nachricht über ICQ schicken
Standard

Code:
(imagesdb_images.imageID =  imagesdb_connections.destination AND imagesdb_connections.source =3 OR 
imagesdb_images.imageDescription LIKE "%Brot%")  
AND (imagesdb_images.imageID =  imagesdb_connections.destination AND imagesdb_connections.source =1 OR 
imagesdb_images.imageDescription LIKE "%Wasser%")
Versuche erstmal dies mit einem OR und nicht mit einem AND zu verknüpfen. Denn du willst ja nicht Wasser UND Brot in deinem Suchergebnis haben oder? Weil dann wäre das mit der source schon wieder komisch.

Zur übersichtlichkeit würde ich ausserdem Aliasse verwenden.

und:


Code:
(imagesdb_bilder.imageID=462 OR imagesdb_images.imageID=463 OR ....)
Viel hübscher wäre:

Code:
(B.imageID= IN (462, 463 [...])
EDIT:
zeilenumbrüche sponsored by kropff
__________________
signed oder unsigned... das ist hier die Frage

Geändert von Kropff (18-03-2009 um 19:01 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 18-03-2009, 19:02
Luki
 Registrierter Benutzer
Links : Onlinestatus : Luki ist offline
Registriert seit: Mar 2006
Ort: Schweiz
Beiträge: 13
Luki ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo Case,

danke schon mal für die Antwort. Mit dem OR klappts. Allerdings sind z.T. pro Bild um die 50 Schlüsselwörter definiert. Es sollen also weirklich nur die Bilder gefunden werden, fü welche beide Schlüsselwörter definiert sind.

Zitat:
Viel hübscher wäre:
Code:
(B.imageID= IN (462, 463 [...])
Da hast du eindeutig recht Werde den Query so anpassen.
Mit Zitat antworten
  #4 (permalink)  
Alt 18-03-2009, 22:00
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Du solltest dir das Result-Set mal ohne WHERE-Bedingung anschauen und dann mal überlegen, ob das mit dem AND so überhaupt klappen kann.

Wenn dir dann klar geworden ist, warum das so nicht klappen kannst, fallen mir spontan folgende Möglichkeiten ein:
1. Pro Suchwort einen Join auf die Tabelle + group by + having COUNT() = Anzahl der Suchworte
2. Ein Join, GROUP_CONCAT auf Such-Wort, where FIND_IN_SET(suchwort_n,group_concat)*Anzahl der Suchworte

wobei ich mir nicht sicher bin, ob letzteres auch wirklich funktioniert...
Mit Zitat antworten
  #5 (permalink)  
Alt 19-03-2009, 09:46
Luki
 Registrierter Benutzer
Links : Onlinestatus : Luki ist offline
Registriert seit: Mar 2006
Ort: Schweiz
Beiträge: 13
Luki ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ja es kam mir schon die ganze Zeit etwas komisch vor. Aber wie gesagt, meine EWrfahrung mit komplexeren Abbragen hält sich in Grenzen. Ist für mich schon ein vorstossen in neue Welten, dass sämtliche Filtermöglichkeiten mit einem einzigen Query funktionieren

Nun ok.. Ich versuch mich da mal rein zu arbeiten. Warum konnte ich auch ausgerechnet heute Nacht nicht schlafen. In totaler Müdigkeit ists richtig mühsahm zu experimentieren

Nun Danke mal für die Antwort. Dann halt ich mich da mal ran und geb Bescheid.
Mit Zitat antworten
  #6 (permalink)  
Alt 19-03-2009, 11:44
Luki
 Registrierter Benutzer
Links : Onlinestatus : Luki ist offline
Registriert seit: Mar 2006
Ort: Schweiz
Beiträge: 13
Luki ist zur Zeit noch ein unbeschriebenes Blatt
Standard

So, ich habs jetz. Danke noch ghost für deinen Anstoss. ich habe nun zwar nicht deine Lösung genommen. bzw, ich habs versucht, aber irgendwie in der super Müdigkeit nicht recht geschnallt. Es wäre vielelicht noch so weit gekommen.. allerdings habe ich während dem probieren was anderes entdeckt. Ich wusste bisher nicht, dass ich in einem Query noch einen weiteren Query verwenden kann. Da schon mal schön was gelernt.

Morgen wenn ich etwas wacher bin, setze ich mich aber nochmals mit deinem Lösungsvorschlag auseinander. Einfach zwecks dessen, dass ichs nachher verstehe. Schliesslich arbeite ich ja die ganze Zeit mit PHP/MySQL. Daher ist der Ausbau des Verständnisses sowieso Pflicht

Nun, sollte es wen interessieren, wie ich es nun gelöst habe. Hier ein Beispielquery mit drei Schlagwörtern.

PHP-Code:
SELECT imageID FROM imagesdb_images p 
LEFT JOIN imagesdb_project pr ON p
.projectID pr.projectID 
LEFT JOIN imagesdb_locations o ON pr
.locationD o.locationD 
WHERE p
.imageID IN (462463464465466467468469470471 [...] ) 
AND (
p.imageID in (SELECT destination from imagesdb_connections where source=3 GROUP BY destination
OR 
p.imageDescription LIKE "%Wasser%"
AND (
p.imageID in (SELECT destination from imagesdb_connections where source=19 GROUP BY destination
OR 
p.imageDescription LIKE "%Loft%"
AND (
p.imageID in (SELECT destination from imagesdb_connections where source=43 GROUP BY destination
OR 
p.imageDescription LIKE "%fritz%"
Mit Zitat antworten
  #7 (permalink)  
Alt 19-03-2009, 11:57
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Subselects sind in MySQL übrigens potentiell eher böse und langsam~
Mit Zitat antworten
  #8 (permalink)  
Alt 19-03-2009, 12:01
Luki
 Registrierter Benutzer
Links : Onlinestatus : Luki ist offline
Registriert seit: Mar 2006
Ort: Schweiz
Beiträge: 13
Luki ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ok. Aber immerhin funktioniert es jetz mal temporär. Ich setze mich dann wie gesagt noch weiter mit deinem Vorschlag auseinander. Dann kann ichs dann noch nachbessern.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:32 Uhr.