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
		";
Wat werkt er niet? Zo is het een beetje de speld in de hooiberg vinden. Dus wat krijg je eruit en wat had je verwacht (of gewild) eruit te krijgen?
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....



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.
Oke, maar het zijn namelijk wel 2 afzondelijke tabellen zeg maar die niet aan elkaar gerelateerd zijn.
Hoe zou ik dat in deze query moeten verwerken?


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?

Alvast bedankt!
Ja dat kan, je maakt een select in je formulier en de waarde van de select bepaald de sorteer volgorde.
Voorbeeldje:
<?php
function setOrderBy($order) {
		if ($order !== 0) {
			if ($order == 1 || $order == 2) {
				$this->_order_by = 'b.brand_name';
				$this->_order_by .= ($order == 2) ? ' DESC' : '';
			}
			if ($order == 3 || $order == 4) {
				$this->_order_by = 'p.product_new_price';
				$this->_order_by .= ($order == 4) ? ' DESC' : '';
			}
			$this->_order_by .= ', p.product_id DESC';
		}
	}
?>

Hoe moet ik dit dan terug refereren maar sql code?

Ik nog niet niet echt zo gevorderd met php en sql (ik ben meer van de Python, etc..)
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

Reageren