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
		";
Als ik ORDER BY system_prijs DESC krijg ik een foutmelding 'Unknown column 'system_prijs' in 'order clause'
maar deze staat er toch echt wel bij?

Hoe kan ik dit het beste oplossen?
Zodat er op naam, prijs en indien mogelijk op onderdelen of systemen alleen gezocht kan worden...



	$zoekquery = 
		"SELECT DISTINCT
		   od_id,
		   od_naam,
		   od_prijs
		 FROM
		   onderdelen

		 WHERE
				((LOWER(od_naam) LIKE '%" . mysql_real_escape_string ($zoek) . "%')
				AND 
				od_removed = 'N' AND
				od_show = 'Y')
		 
		UNION
	
		SELECT DISTINCT
		   system_auto_id,
		   system_naam,
		   system_prijs   
		 FROM
		   systemen
		 WHERE
				((LOWER(system_naam) LIKE '%" . mysql_real_escape_string ($zoek) . "%')
				AND 
				system_removed = 'N' AND
				system_show = 'Y')
		ORDER BY
				system_prijs DESC
		LIMIT 100
		";




Toevoeging op 07/06/2013 14:14:23:

maar op od_prijs kan ik raar genoeg wel sorteren


				system_show = 'Y')
		ORDER BY
				od_prijs DESC
		LIMIT 100

Dat is niet vreemd, het uiteindelijke resultaat van de union heeft de kolomnamen van de eerste select statement.
Oh okej, nu heb de id van systemen boven geplaats onder ondelen en dan krijg ik not correct use of UNION
Nee, nee, dat moet je helemaal niet doen.
Wat je krijgt als je een union gebruikt is dat de kolomnamen zoals in de eerste query gegeven de kolomnamen worden voor de hele resultset. Je kan immers niet dezelfde kolom eerst met de ene naam en vervolgens met een andere naam hebben. In jouw geval krijg je dus od_id, od_naam en od_prijs als namen. In je order by kun je dus alleen die kolommen gebruiken. Wat je eventueel nog wel kan doen (regelmatig handig), is een extra virtuele kolom opnemen waaruit je later nog kan afleiden wat voor record je hebt:

         SELECT DISTINCT
           od_id,
           od_naam,
           od_prijs,
           'onderdeel' AS record_type
...
UNION
         SELECT DISTINCT
           system_auto_id,
           system_naam,
           system_prijs,
           'system'
...

Zo weet je dus als je de rijen aan het uitlezen bent of het id van een onderdeel is, of van een system. Hier kan je dan ook nog op sorteren.
Dat kan dus niet, de SELECT statements in UNION moeten hetzelfde aantal kolommen hebben.
En om je volgende vraag voor te zijn, om te kunnen bepalen of het een systeem of een onderdeel is, voeg je een literal toe aan de SELECT, dus:

SELECT
	'onderdeel' AS soort,
	od_id,
	.....
FROM
	onderdelen
....
SELECT
	'systeem' AS soort,
	system_id,
	.....
FROM
	systemen
....
Gelukkig hebben we nog steeds elke keer dezelfde tips :-)
Lol, inderdaad ja, je was me weer eens net voor ;-)

Toevoeging op 07/06/2013 17:01:00:

PS.
SELECT DISTINCT hoeft niet, de DISTINCT zit al in de UNION

Reageren