Avatar billede doozerii Nybegynder
03. august 2003 - 16:40 Der er 1 kommentar og
1 løsning

Søgning i relationel database

Hejsa

Jeg har to tabeller med indhold der via en dummy table er bundet sammen. Jeg skal bruge en query der søger i begge tabeller, og giver et resultat uden dubletter.

Min nuværende query string ser således ud:
(sakset fra phpmyadmin)
SELECT entry . * , person . *
FROM entry
INNER JOIN personrel ON personrel.entryid = entry.entryid
JOIN person ON person.personid = personrel.personid
WHERE (
entry.keywords
LIKE '%ande%' OR entry.title
LIKE '%ande%' OR entry.year
LIKE '%ande%' OR person.lname
LIKE '%ande%' OR person.fname
LIKE '%ande%'
)

Den bliver dynamisk genereret således at hvis der er flere ord i querystringen, bliver der tilføjet en AND og hele den sidste parantes igen.

Problemet er at denne giver dubletter, den giver et entry for hvert navn i person, dvs. hvis jeg som ovenfor søger på "%ande%", så får jeg entry'et andeby men med alle de personer der er relateret hertil. dvs. hvis der er 5 personer, så får jeg 5 entries tilbage. Jeg skal faktisk kun bruge entryid'et, så fisker jeg selv resten. - Men den skal stadigt søge i alle personerne, dvs. finde de entryid's der matcher søgningen, i alle tabellerne. Og helst i et hug.

tabellerne er defineret således:
(Indexet er opgivet pga. søgning på f.eks. TV.)
CREATE TABLE entry (
  entryid int(11) NOT NULL auto_increment,
  title varchar(150) NOT NULL default '',
  city varchar(50) default NULL,
  year varchar(4) default NULL,
  pageno varchar(6) default NULL,
  keywords text,
  note text,
  publisher varchar(100) default NULL,
  firstyear text,
  edition varchar(30) default NULL,
  pubplace varchar(100) default NULL,
  PRIMARY KEY  (entryid),
  FULLTEXT KEY all (title,keywords,year)
) TYPE=MyISAM COMMENT='Modellerer de entrys der er i databasen';


CREATE TABLE personrel (
  personrelid int(11) NOT NULL auto_increment,
  personid int(11) NOT NULL default '0',
  roleid int(11) NOT NULL default '0',
  entryid int(11) NOT NULL default '0',
  PRIMARY KEY  (personrelid),
  KEY personid (personid),
  KEY roleid (roleid),
  KEY entryid (entryid)
) TYPE=MyISAM COMMENT='modellere hvilke role en person har';

CREATE TABLE person (
  personid int(11) NOT NULL auto_increment,
  fname varchar(100) default NULL,
  lname varchar(100) default NULL,
  PRIMARY KEY  (personid),
  FULLTEXT KEY fname_3 (fname,lname)
) TYPE=MyISAM COMMENT='Modellere personer med et navn';


Mvh
Kristoffer - håber at det giver mening. :-)
Avatar billede arne_v Ekspert
03. august 2003 - 16:49 #1
Jeg kan ikke helt gennemskue hvad du vil.

Men muligvis kan du erstatte:

SELECT entry.*, person.*

med:

SELECT DISTINCT entry.entryid

[og resten det samme]
Avatar billede doozerii Nybegynder
03. august 2003 - 19:47 #2
jeg fik løst det med en DISTINCT entry.* - så får jeg slet ingen dubletter. og den søger stadigt i alle felterne. - lige som det skulle være. Takker.

/Kristoffer
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester