FULLTEXT search over 2 tabellen.
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?
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)
1
2
3
4
5
6
7
8
9
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
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.
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
Is goed. Tip: probeer het eerst alleen met die twee MATCH AGAINST's voordat je JOIN's gaat toevoegen.
Eerst maar is laten werken daarna uitbreiden met de joins.
ps: handig forum dit. Heb hem meteen in me bookmarks gezet :-)
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!!
Oké, mooi dat het werkt nu :-)