Ik wil graag uit 2 tabellen van de database gegevens halen voor een zoekfuntie.
Maar het onderstaande commando werkt helemaal, heeft iemand enig idee?
$zoekquery =
"SELECT DISTINCT
od_id,
od_naam,
od_prijs,
system_auto_id,
system_naam,
system_prijs
FROM
onderdelen,
systemen
WHERE
((LOWER(od_naam) LIKE '%" . mysql_real_escape_string ($zoek) . "%')
AND
od_removed = 'N' AND
od_show = 'Y')
OR
((LOWER(system_naam) LIKE '%" . mysql_real_escape_string ($zoek) . "%')
AND
system_removed = 'N' AND
system_show = 'Y')
ORDER BY
od_id, system_auto_id
DESC
";
Het script geeft wel output, maar geeft dezelfde rij 100+ * weer waar het zoekwoord in voorkomt.
Daarnaast worden de overige producten waarin het zoekterm niet in voorkwam 1x weergegeven (met andere worden alle producten).
product a
product a
product a
product a
product a
Etc....
product b
product b
Etc....
Toevoeging op 05/06/2013 16:43:31:
Patrick cos op 05/06/2013 16:42:21
Ja sorry,
Het script geeft wel output, maar geeft dezelfde rij 100+ * weer waar het zoekwoord in voorkomt.
Daarnaast worden de overige producten waarin het zoekterm niet in voorkwam 1x weergegeven (met andere worden alle producten).
product a
product a
product a
product a
product a
Etc....
product b
product b
Etc....
Nog iets:
Toen ik het onderstaande gebruikte voor alleen de onderdelen werkte het script wel goed, maar sinds ik systemen toegevoegd heb niet meer.
((LOWER(od_naam) LIKE '%" . mysql_real_escape_string ($zoek) . "%')
AND
od_removed = 'N' AND
od_show = 'Y')
Dit kan natuurlijk nooit.
Dat is het nadeel van impliciete joins, je vergeet heel makkelijk de join condities, dus je moet altijd een
onderdelen.systeem_id = systemen.systeem_id
in je where hebben staan, anders heb je een cross join, en dat wil zeggen dat elke rij in tabel A aan alle rijen in tabel B wordt gekoppeld.
Dan kan je beter een UNION gebruiken. Dus selecteer eerst alle rijen van de een, dan van de ander en voeg ze samen met een UNION. Daarop kan je dan eventueel nog een sorteer actie uitvoeren.
Dan zou je dit opslitsen in twee query's en met union aan elkaar knopen.
Maar beter kan je de database opzet veranderen, kortom ervoor zorgen dat die twee tabellen wel een relatie krijgen.
Als voorbeeld:
Een systeem heeft meerdere onderdelen, en een onderdeel kan ook in meerdere sytemen voorkomen.
Dit is een meer - meer relatie, dus dan heb je ALTIJD een extra tabel nodig.
Union werkt goed, wist niet dat het op die manier kon, bedankt!
Voor de rest werkt het systeem gewoon goed, maar de onderdelen kunnen wel in systemen geplaatst worden...?
Hoe is het bijvoorbeeld mogelijk om op prijs of prijs te sorteren, waarbij de gebruiker dit kan bepalen?
Aan het eind van de query (maar voor een eventuele LIMIT) ORDER BY kolom1 (ASC of DESC), kolom2 (ASC of DESC) toevoegen.
ASC is oplopend, dat is de default dus mag je weglaten, DESC is aflopend.
Dus bv:
SELECT kolom1, kolom2, kolom3
FROM tabel
WHERE kolom2 > 13
ORDER BY kolom2, kolom1 DESC