FULLTEXT search over 2 tabellen.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ferry

Ferry

05/12/2006 14:32:00
Quote Anchor link
Ik heb 2 tabellen met in de ene tabel allemaal facturen en in de 2e tabel crediteuren. Nu heb ik een zoek funtie die naar: opmerking, crediteurnummer en factuurnummer kan zoeken. Al deze velden bevinden zich in 1 tabel.

Nu wil ik met de zelfde zoek query ook gaan zoeken in de crediteuren tabel naar crediteurnaam.

Dit zijn de indexen op de tabellen:

ALTER TABLE `inkoopregister_facturen` DROP INDEX `zoekfunctie` ,
ADD FULLTEXT `zoekfunctie` (
`opmerking` ,
`factnummer_leverancier` ,
`crediteurnummer`
)

ALTER TABLE `eva_crediteuren` DROP INDEX `zoekfunctie` ,
ADD FULLTEXT `zoekfunctie` (
`naam1lijn` ,
`naam2lijn`
)

En dit is de query:

SELECT i.id, i.crediteurnummer, i.factnummer_leverancier, i.factuur_datum, i.betaald_datum, i.bedrag, i.boeknummer, eg.Naam, ec.naam1lijn
FROM inkoopregister_facturen AS i
LEFT JOIN eva_gebruikersinfo AS eg ON eg.Nummer = i.verantwoord_id
LEFT JOIN inkoopregister_status AS irs ON irs.status_id = i.status_id
LEFT JOIN eva_crediteuren AS ec ON ec.crediteur_nr = i.crediteurnummer
WHERE MATCH (

i.factnummer_leverancier, i.crediteurnummer, i.opmerking
)
AGAINST (
'test'
)

Ik had al van iemand een tip gekregen om de rest te koppelen via OR zoals hier onder te zien is:

SELECT i.id, i.crediteurnummer, i.factnummer_leverancier, i.factuur_datum, i.betaald_datum, i.bedrag, i.boeknummer, eg.Naam, ec.naam1lijn
FROM inkoopregister_facturen AS i
LEFT JOIN eva_gebruikersinfo AS eg ON eg.Nummer = i.verantwoord_id
LEFT JOIN inkoopregister_status AS irs ON irs.status_id = i.status_id
LEFT JOIN eva_crediteuren AS ec ON ec.crediteur_nr = i.crediteurnummer
WHERE MATCH (

i.factnummer_leverancier, i.crediteurnummer, i.opmerking
)
AGAINST (
'test'
)
OR WHERE MATCH (
ec.naam1lijn, ec.naam2lijn
)
AGAINST (
'test'
)

Maar dat werkt niet.

iemand anders een idee hoe ik een MATCH() AGAINST() kan doen met 2 verschillende tabellen?
 
PHP hulp

PHP hulp

19/11/2024 06:43:30
 
Jan Koehoorn

Jan Koehoorn

05/12/2006 15:36:00
Quote Anchor link
Ik heb even een testje gedaan, met twee mini-tabellen en dat werkt wel. Bij mij ziet het er zo uit:


Dit zijn de tabellen:
CREATE TABLE autos (
id int(11) NOT NULL auto_increment,
merk varchar(255) NOT NULL,
klant_id int(11) NOT NULL,
PRIMARY KEY (id),
FULLTEXT KEY zoekdeel (merk)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE klanten (
id int(11) NOT NULL auto_increment,
naam varchar(255) NOT NULL,
PRIMARY KEY (id),
FULLTEXT KEY zoekdeel (naam)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


In de tabel autos heb ik dit:
id merk klant_id
1 mercedes 1
2 ferrari 2
3 porsche 3
4 lotus 4

In de tabel klanten heb ik dit:
id naam
1 jan koehoorn
2 piet bakker
3 johan cruijff
4 ronald koeman

En als ik deze query doe:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
SELECT a.merk, k.naam
FROM autos AS a, klanten AS k
WHERE    
    (
    MATCH (k.naam) AGAINST ('koehoorn')
    OR
    MATCH (a.merk) AGAINST ('koehoorn')
    )
    AND k.id = a.klant_id

Dan rolt er keurig uit:
merk naam
mercedes jan koehoorn

Ik hoop dat je iets met mijn voorbeeld kunt.
 
Ferry

Ferry

05/12/2006 15:54:00
Quote Anchor link
Beste Jan,

Bedankt voor je test... krijg net te horen dat het bedrijf hier om 16:00 uur dicht gaat dus het testen moet ik even uitstellen ;-)

Maar ga hier dan ook wel een kleine test doen kijken of dat werkt en daarvandaan de query langzaam aan weer opbouwen.

Je hoort morgen van me wat mijn bevindingen zijn.
BVD
 
Jan Koehoorn

Jan Koehoorn

05/12/2006 15:55:00
Quote Anchor link
Is goed. Tip: probeer het eerst alleen met die twee MATCH AGAINST's voordat je JOIN's gaat toevoegen.
 
Ferry

Ferry

05/12/2006 16:01:00
Quote Anchor link
Dat idee had ik ook...
Eerst maar is laten werken daarna uitbreiden met de joins.

ps: handig forum dit. Heb hem meteen in me bookmarks gezet :-)
 
Ferry

Ferry

05/12/2006 17:01:00
Quote Anchor link
Beste Jan,

ik kon het niet uitstaan dat het bij jou werkte en bij mij niet :-)

Ben net dus nog even gaan zoeken wat dan het verschil is en na een hoop proberen zag ik de fout...

dit was het:

WHERE MATCH (

i.factnummer_leverancier, i.crediteurnummer, i.opmerking
)
AGAINST (
'test'
)
OR WHERE MATCH (
ec.naam1lijn, ec.naam2lijn
)
AGAINST (
'test'
)

en diet moet het zijn:

WHERE MATCH (

i.factnummer_leverancier, i.crediteurnummer, i.opmerking
)
AGAINST (
'test'
)
OR MATCH (
ec.naam1lijn, ec.naam2lijn
)
AGAINST (
'test'
)

Ik had na de OR een WHERE staan en die hoort er niet :-)

THNX voor je hulp!!
 
Jan Koehoorn

Jan Koehoorn

05/12/2006 17:07:00
Quote Anchor link
Oké, mooi dat het werkt nu :-)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.