Toon posts:

zoeken naar meerdere keywords

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb het volgende probleem:

m'n database ziet er als volgt uit:
foto id, url, datum, city_id, headline_id, fotograaf_id
keywords id, keyword
fotokey id, keyword_id, foto_id

als ik op een keyword zoek dan gebruik ik de volgende query:
code:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
        url
     FROM
        keyfoto as A,
        foto as B,
        keywords as C
     WHERE
        A.key_id = C.id
        AND
        B.id = A.foto_id
        AND 
        C.keyword like '%$key%'";


Echter werkt dit alleen met 1 keyword. Zodra er een tweede aan te pas komt werkt het al niet meer.

Dus dacht ik de zoekopdracht te splitsen (explode met spatie) om vervolgens de query te herhalen en het resultaat in een array te zetten. Het komt dus in een 2d array.
Deze arrays moeten dan vergeleken worden... in php komt daar voor array_intersect van pas.
Echter weet ik niet hoeveel keyword bij de zoekopdracht komen. Dus kan het zijn dat er niets vergeleken hoeft te worden (1 keyword) maar het kan ook dat er 5 arrays met elkaar vergeleken moeten worden.

Hoe moet ik dit dan oplossen??? is er een andere query die dit probleem oplost? of moet ik echt arrays gaan vergelijken???

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:44

Creepy

Tactical Espionage Splatterer

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Ik kom heel veel fulltext tegen.
In mijn database staat elke keyword in een aparte rij...

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 21:24

NMe

Quia Ego Sic Dico.

Eerst de keywords exploden op een spatie, en daarna imploden:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$keywords = 'aap noot mies';
$arrKW = eplode(' ', $kewords);
$keywords = '%'.implode('%\' OR c.keyword LIKE \'%', $arrKW).'%';
$query = "SELECT
        url
     FROM
        keyfoto as A,
        foto as B,
        keywords as C
     WHERE
        A.key_id = C.id
        AND
        B.id = A.foto_id
        AND 
        C.keyword like '".$keywords."'";

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Als ik de query in me hoofd uitvoer, heb je alleen het probleem dat als een foto meerdere keywords heeft, de url dan ook zo vaak voorkomt...
In het voorbeeld van hierboven, als een foto zowel een keyword 'aap' als 'noot' heeft, komt de url 2x in de result voor.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:44

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op maandag 20 december 2004 @ 21:19:
Als ik de query in me hoofd uitvoer, heb je alleen het probleem dat als een foto meerdere keywords heeft, de url dan ook zo vaak voorkomt...
In het voorbeeld van hierboven, als een foto zowel een keyword 'aap' als 'noot' heeft, komt de url 2x in de result voor.
select DISTINCT url zorgt ervoor dat elke URL maar 1 keer voorkomt.

Overigs staat dit prima uitgelegd in een beetje SQL tutorial ;)

[ Voor 14% gewijzigd door Creepy op 20-12-2004 21:25 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Ik krijg vervolgens alles wat in de database staat :?

de query bij 2 keywords ziet er als volgt uit:
code:
1
2
3
4
5
6
7
8
9
10
SELECT 
      url 
FROM 
      keyfoto as A, 
      foto as B, 
      keywords as C 
WHERE
      A.key_id = C.id 
      AND B.id = A.foto_id 
      AND C.keyword like '%nordin%' OR C.keyword LIKE '%vrijstaand%'


in de database staan in totaal 4 x nordin en 2 daarvan staat ook vrijstaand als keyword...
voor de rest geen vrijstaand in de database gerelateerd aan een foto.

[ Voor 86% gewijzigd door Verwijderd op 20-12-2004 21:35 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:44

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op maandag 20 december 2004 @ 21:30:
Ik krijg vervolgens alles wat in de database staat :?
Je hebt toch niet alleen "select distinct URL" uitgevoerd he?
Ga als een gek eens google gebruiken of pak er een SQL tutorial bij om zo uit te zoeken wat DISTINCT doet, en gebruik die kennis dan om DISTINCT ergens in de query die -NMe- je gegevens heeft in te voegen.

Nah vooruit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?
$keywords = 'aap noot mies';
$arrKW = eplode(' ', $kewords);
$keywords = '%'.implode('%\' OR c.keyword LIKE \'%', $arrKW).'%';
$query = "SELECT
        DISTINCT url
     FROM
        keyfoto as A,
        foto as B,
        keywords as C
     WHERE
        A.key_id = C.id
        AND
        B.id = A.foto_id
        AND 
        C.keyword like '".$keywords."'";
?>


Volgende keer mag je wel ietsje meer moeite doen. Dit is erg basic SQL.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
ik weet dat distinct alle dubbele eruit vist! dat hoefde ik niet op te zoeken. maar hij geeft nogsteeds alle items uit de database :S

  • avoid
  • Registratie: November 2002
  • Laatst online: 20:01
Als je deze regel:
code:
1
      AND C.keyword like '%nordin%' OR C.keyword LIKE '%vrijstaand%'

vervangt door deze:
code:
1
      AND (C.keyword like '%nordin%' OR C.keyword LIKE '%vrijstaand%')

dan werkt 't vast beter. Haakjes zijn van levensbelang in SQL-queries!

Time flies like an arrow, fruit flies like a banana.


Verwijderd

Topicstarter
dat werkt dan weer wel... thnx...

nu nog 1 klein probleempje... als ik kies voor AND ipv OR werkt het weer niet :?
alle keywords moeten bij die foto voorkomen!!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:44

Creepy

Tactical Espionage Splatterer

Denk nou eens na. Je vraagt nu alle rijen op waarvan en nordin en vrijstaand tegelijk voorkomen. Er wordt alleen een rij getoond als aan allebei de voorwaarden wordt voldaan. Dat is dus geen enkele rij ;)

Je zult alle ID's moeten tonen die net zo vaak terugkomen in je resultaat als dat er keyword zijn. Dit kan met een constructie als
code:
1
2
AND (C.keyword like '%nordin%' or C.keyword LIKE '%vrijstaand%')
HAVING Count (B.Id) = 2

[ Voor 4% gewijzigd door Creepy op 20-12-2004 22:31 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
ok, nu krijg ik alleen niets terug....
die 2 staat dus voor het aantal keywords dat er gezocht worden?

Verwijderd

Topicstarter
toch even een kleine kick...
ik snap er nogsteeds niets van...

Verwijderd

Topicstarter
Ok, het is gelukt geloof ik... als ik er nog 1 minuut meer aan geklooid had was ik gek geworden!!!
bedankt iedereen voor de hulp

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT
        url, count(url) as aantal
     FROM
        keyfoto as A,
        foto as B,
        keywords as C
     WHERE
        A.key_id = C.id
        AND
        B.id = A.foto_id
        AND 
        (C.keyword like '".$keywords."')
    GROUP BY
        B.id
    HAVING  count(B.url) = $aantal
Pagina: 1