[MySQL] Sliter med MATCH() AGAINST()

[MySQL] Sliter med MATCH() AGAINST()

Innleggav tjodolv » søn 29.06.2008 3:35

Hei og hå. Jeg plundrer med å forstå hva som er galt med et query i et script jeg lager.
Jeg har en liten database som inneholder en tabell med alle filmene jeg har på DVD.
Tabellen ser slik ut:
Kode: Merk alt
--
-- Table structure for table `filmer`
--

CREATE TABLE `filmer` (
  `id` int(6) NOT NULL auto_increment,
  `tittel` varchar(255) NOT NULL,
  `tittel_the` varchar(255) NOT NULL,
  `spilletid` int(4) NOT NULL,
  `kategori` varchar(100) NOT NULL,
  `serie` varchar(255) default NULL,
  `nr` int(2) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  FULLTEXT KEY `tittel` (`tittel`),
  FULLTEXT KEY `serie` (`serie`),
  FULLTEXT KEY `kategori` (`kategori`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Så fyller jeg den med filmer fra en tekstfil, og kan hente ut filmene og vise en liste over alle. Så langt går det greit. Følgende kode:
Kode: Merk alt
$sql = "SELECT * FROM filmer";
$result = mysql_query($sql);
while ($value = mysql_fetch_object($result)) :
   $class = ($i % 2) ? 'odd' : 'even';
   $row = "\t\t".'<tr class="%s"><td><a href="http://www.imdb.com/find?s=tt&amp;q=%s" title="Slå opp %s på IMDB.com">%s</a></td><td>%s</td><td>%s</td><td>%s</td></tr>'."\n";
   $serie = ($value->nr != 0) ? $value->serie.' '.$value->nr : '';
   printf($row, $class, html_entity_decode($value->tittel), html_entity_decode($value->tittel), html_entity_decode($value->tittel_the), $value->spilletid, $value->kategori, $serie);
   $i++;
endwhile;

Gir en tabell med filmene, spilletid, kategori osv. Problemet kommer når jeg skal begrense visningen. Dersom queryet utvides til hvilket som helst av følgende, vises alle filmer som har 'Komedie' eller 'Etellerannet/Komedie' eller egentlig hva som helst som har 'komedie' i kategorien.
Denne gir alt som har Komedie eller Action/Komedie eller Drama/Komedie eller Romantisk komedie...
Kode: Merk alt
SELECT * FROM filmer WHERE MATCH (kategori) AGAINST ('Action/Komedie') ORDER BY tittel_the

... mens denne gir alt av Drama, Drama/Komedie, Action/Drama etc...
Kode: Merk alt
SELECT * FROM filmer WHERE MATCH (kategori) AGAINST ('Drama/Komedie') ORDER BY tittel_the

MEN: Denne koden gir 0 resultater:
Kode: Merk alt
SELECT * FROM filmer WHERE MATCH (kategori) AGAINST ('Action') ORDER BY tittel_the

Og jeg skjønner ingenting. Dette gjelder kun når 'Action'. Andre "singelkategorier" som feks 'Komedie' eller 'Thriller' gir mer eller mindre forventede resultater.

Er det eventuelt andre tilnærminger til søk som fungerer bedre..?

Brukerens avatar
medlem i 208 måneder
 

Re: [MySQL] Sliter med MATCH() AGAINST()

Innleggav ak » søn 29.06.2008 6:38

Det du egentlig vil ha er å dele dette opp i to tabeller, den første tabellen inneholder kategori_id,kategori_tekst: (1,action) , (2, komedie)

og så en separat tabell som matcher film_id , kategori_id

Dvs for en film som er en Action / Komedie så finnes det to rader i sistnevnte tabell.

Men som midlertidig løsning kan du prøve å søke på '%Action%' istedet. Merk at dette er et mye dyrere søk, uten at det spiller noen rolle til ditt bruk.

Administrator
Brukerens avatar
medlem i 236 måneder
 

Re: [MySQL] Sliter med MATCH() AGAINST()

Innleggav tjodolv » søn 29.06.2008 14:37

Å dele det opp i flere tabeller var absolutt en bedre løsning ja. Takker :)

Brukerens avatar
medlem i 208 måneder
 


Returner til Scripting



Hvem er i Forumene

Registrerte brukere: Google [Bot]