Søgning i relationel database
HejsaJeg 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. :-)