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
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
....