[MySQL] waar bestand bevat de woorden.... (kruistabel)

Pagina: 1
Acties:
  • 425 views sinds 30-01-2008
  • Reageer

  • js303
  • Registratie: April 2003
  • Laatst online: 25-01 14:14
help ik kom er niet uit. ik heb 3 tabellen:

ws_files: tabel met bestanden
ws_keywords: tabel met woorden
ws_keywords_rel: kruistabel - koppelingen tussen bestanden en woorden (veel op veel koppelingen)

voorbeeld:
file 1: "piet" heeft 3 woorden gekoppeld: "auto", "fiets" en "bus"
file 2: "truus" heeft 4 woorden gekoppeld: "fiets", "bus", "brommer", "trein"
file 3: "klaas" heeft 2 woorden gekoppeld: "motor" en "bus"

query: geef alle bestanden die zowel de woorden "fiets" als "bus" bevatten (dus en-en)
resultaten zouden dan moeten zijn: file 1 "piet" en 2 "truus". file 3 niet want die heeft alleen een koppeling naar "bus" en niet naar "fiets".

ik dacht dat ik de oplossing had gevonden, maar dat werkt alleen wanneer er op 2 woorden gezocht wordt, maar niet bij 1 of >2 woorden:

SQL:
1
2
3
4
5
6
SELECT DISTINCT s.source_id
FROM ws_files_sources s, ws_lists_rel r1, ws_lists_rel r2
WHERE r1.filesource_id = s.source_id 
AND r1.listitem_id IN (woord1, woord2) 
AND r2.listitem_id IN (woord1, woord2) AND r2.filesource_id = r1.filesource_id AND r2.id != r1.id
ORDER BY r1.filesource_id


}:O

btw: onze server draait mysql 3.23.

[ Voor 23% gewijzigd door js303 op 15-05-2006 16:41 ]


  • Matthis
  • Registratie: Juli 2004
  • Laatst online: 21-02 12:25
kun je niets doen met HAVING?

SQL:
1
2
3
4
SELECT (ws_keywords_rel.bestands_id) FROM ws_keywords_rel, ws_keywords
WHERE (ws_keywords.keywoord) IN (lijstje met je woorden)
GROUP BY (ws_keywords_rel.bestands_id)
HAVING COUNT(ws_keywords.keywoord) >= 'aantal gezochte woorden'


zoiets zou moeten werken (als je de velden aanpast natuurlijk)...
of het een nette oplossing is, is een andere vraag ...

  • Roa
  • Registratie: December 2002
  • Laatst online: 03-07-2024

Roa

Ik denk dat je mijn topic even door moet nemen, wellicht staan er nuttige dingen in, volgens mij zijn onze problemen namelijk vergelijkbaar en ik heb geen probleem meer :)

[rml][ php/mysql] koppeltabel / joins[/rml]

Research is what I'm doing when I don't know what I'm doing.


  • js303
  • Registratie: April 2003
  • Laatst online: 25-01 14:14
@ Matthis:

ok, dat werkt dus in 1 klap.... goud!
waar ik dus op telkens op vastliep is dat ik dit soort dingen probeerde:
SQL:
1
2
3
4
5
SELECT r1.filesource_id
FROM ws_keywords_rel r1
WHERE r1.listitem_id IN (word_id1,word_id2,word_id3) AND count(r1.listitem_id) = aantal_woorden
GROUP BY r1.filesource_id
ORDER BY matches DESC

wat niet gaat werken (MySQL error: Invalid use of group function), omdat GROUP BY pas na de WHERE clause aan de slag gaat vermoed ik:
* In the WHERE clause, you can use any of the functions and operators that MySQL supports, except for aggregate (summary) functions
enfin, de uiteindelijke goed werkende query:
SQL:
1
2
3
4
SELECT (r.filesource_id) FROM ws_keywords_rel r
WHERE (r.listitem_id) IN (word_id1,word_id2,word_id3) 
GROUP BY (r.filesource_id) 
HAVING COUNT(r.listitem_id) >= aantal_woorden


besef ik eindelijk eens waar HAVING nuttig voor is... had HAVING links laten liggen omdat ik stomgenoeg dacht dat >= MySQL 4.0 was. 8)7
* In general, clauses used must be given in exactly the order shown in the syntax description. For example, a HAVING clause must come after any GROUP BY clause and before any ORDER BY clause. The exception is that the INTO clause can appear either as shown in the syntax description or immediately preceding the FROM clause.
* http://dev.mysql.com/doc/refman/4.1/en/select.html

[ Voor 32% gewijzigd door js303 op 16-05-2006 10:27 ]