Avatar billede Slettet bruger
19. maj 2003 - 11:11 Der er 15 kommentarer og
1 løsning

Søge i 2 tabeller

Hej!

Jeg vil gerne søge i 2 tabeller på en gang, felterne der skal søges i er "overskrift" og "indhold".

Hvis jeg skal kunne bruge resultatet til noget skal jeg på en eller anden måde have at vide i hvilken tabel de enkelte resultater blev fundet, da der ud fra det skal linkes til 2 forskellige sider.

Her er strukturen for mine tabeller:

#
# Table structure for table 'dokument_kategorier'
#

DROP TABLE IF EXISTS dokument_kategorier;
CREATE TABLE dokument_kategorier (
  id int(10) unsigned NOT NULL auto_increment,
  ejerid int(10) unsigned default '0',
  sortering int(10) unsigned default NULL,
  overskrift varchar(100) default NULL,
  indhold text,
  PRIMARY KEY  (id)
) TYPE=MyISAM;



#
# Table structure for table 'dokumenter'
#

DROP TABLE IF EXISTS dokumenter;
CREATE TABLE dokumenter (
  id int(10) unsigned NOT NULL auto_increment,
  dato_udgivelse date default NULL,
  dato_arkivering date default NULL,
  overskrift varchar(100) default NULL,
  kategori int(10) default NULL,
  indhold text,
  PRIMARY KEY  (id)
) TYPE=MyISAM;
Avatar billede sito Nybegynder
19. maj 2003 - 11:23 #1
SELECT * FROM dokument_kategorier, dokumenter WHERE dokumenter.overskrift = dokument_kategorier.overskrift
Avatar billede sito Nybegynder
19. maj 2003 - 11:24 #2
AND dokument.indhold = dokument_kategorier.indhold
Avatar billede sito Nybegynder
19. maj 2003 - 11:25 #3
Den vælger alt fra de to tabeller, hvor overskrift og indhold er ens.
Avatar billede Slettet bruger
19. maj 2003 - 12:36 #4
Ja, men det skulle den ikke ;)

Den skal bare søge helt normalt, og finde de poster hvor søgeordene findes i enten indhold eller overskrift.

Sådan her:

Jeg indtaster søgeord, og scriptet søger så efter poster i dokument_kategorier og dokumenter hvor indhold eller overskrift indeholder søgeordet.
Avatar billede sito Nybegynder
19. maj 2003 - 13:22 #5
ahhh, okay. Er det programmeret i php?

Så kunne det jo laves:

SELECT indhold, overskrift FROM dokumenter, dokument_kategorier WHERE indhold LIKE $soegeord
Avatar billede Slettet bruger
19. maj 2003 - 13:28 #6
Ja det er i PHP, men det er nok ikke så nemt som du der lægger op til.

En sådan søgning resulterer i (som jeg selv tidligere har prøvet) i denne fejl:

Column: 'overskrift' in field list is ambiguous

Det kan løses ved at gøre sådan her:

SELECT dokumenter.indhold, dokumenter.overskrift, dokument_kategorier.indhold, dokument_kategorier.overskrift FROM dokumenter, dokument_kategorier

Men det giver en stribe underlige og redundante (gentagelser) resultater
Avatar billede Slettet bruger
19. maj 2003 - 14:02 #7
Altså hele pointen er at jeg vil flette disse to queryes sammen til en:

SELECT * FROM dokument_kategorier
SELECT * FROM dokumenter

Jeg havde så tænkt mig at linke til forskellige sider ved at tjekke om resultatet indeholder feltet "ejerid" for det gør kun dokument_kategorier
Avatar billede sito Nybegynder
19. maj 2003 - 14:02 #8
Det er vel fordi du har redundante værdier i dine tabeller? Måske du skulle nøjes med den ene af tabellerne.
Avatar billede Slettet bruger
19. maj 2003 - 14:06 #9
sito> Nej, det er ikke redundante data. Den ene tabel indeholder nogle artikler, den anden nogle beskrivelser af de kategorier artiklerne ligger i.
Avatar billede sito Nybegynder
19. maj 2003 - 14:12 #10
Prøv at udvid din egen til:

SELECT dokumenter.indhold, dokumenter.overskrift, dokument_kategorier.indhold, dokument_kategorier.overskrift FROM dokumenter, dokument_kategorier
WHERE dokumenter.indhold LIKE $soegeord
Avatar billede sito Nybegynder
19. maj 2003 - 14:22 #11
SELECT dokumenter.indhold, dokumenter.overskrift, dokument_kategorier.indhold, dokument_kategorier.overskrift FROM dokumenter, dokument_kategorier
WHERE dokumenter.indhold LIKE $soegeord
OR dokumenter.overskrift LIKE $soegeord
OR dokument_kategorier LIKE $soegeord
OR dokument_kategorier LIKE $soegeord

Måske...
Avatar billede sito Nybegynder
19. maj 2003 - 14:24 #12
UPS, glemte lige noget ;)

SELECT dokumenter.indhold, dokumenter.overskrift, dokument_kategorier.indhold, dokument_kategorier.overskrift FROM dokumenter, dokument_kategorier
WHERE dokumenter.indhold LIKE $soegeord
OR dokumenter.overskrift LIKE $soegeord
OR dokument_kategorier.indhold LIKE $soegeord
OR dokument_kategorier.overskrift LIKE $soegeord
Avatar billede Slettet bruger
19. maj 2003 - 14:29 #13
Ja, men det virker...næsten. Men jeg fandt frem til at det skal være noget i stil med det her, eftersom MySQL endnu ikke understøtter UNION:

SELECT dokumenter.overskrift AS dok_overskrift, dokument_kategorier.overskrift AS kat_overskrift, dokument_kategorier.ejerid, IFNULL(dokument_kategorier.id, dokumenter.id) AS id
FROM _dummy AS D
LEFT JOIN dokument_kategorier ON (D.num = 0)
LEFT JOIN dokumenter ON (D.num = 1)
WHERE D.num < 2 AND IFNULL(dokument_kategorier.id,dokumenter.id) IS NOT NULL
ORDER BY id

Og det fungerer faktisk glimrende. Men jeg vil da gerne honere dine forsøg med point hvis du lægger et svar :)
Avatar billede sito Nybegynder
19. maj 2003 - 15:46 #14
Okay, den havde jeg ikke gennemskuet, så jeg har også lært lidt:)
Du får et svar, selvom jeg vel ikke helt har fortjent pointene...
Avatar billede Slettet bruger
19. maj 2003 - 15:57 #15
_dummy er iøvrigt en tabel med kun et felt der hedder num og er af typen TINYINT. Her indsætter man så mange poster som man vil søge i, startende med tallet 0 og så stigende med en for hver tabel.

Det med at sætte $soegeord ind var faktisk det nemmeste af det hele :)

Får du brug for det en gang skal jeg nok forklare det lidt bedre ;)
Avatar billede sito Nybegynder
19. maj 2003 - 16:00 #16
hæhæ, fint nok :)
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