query in query?
Echter... ik heb een SELECT (sub)query in het WHERE statement gemaakt, en ik vraag me af of dat gebruikelijk is, of moet ik wellicht een andere (betere) oplossing kiezen? Hij werkt in ieder geval prima. Kan iemand er iets over zeggen? Dit is de query:
Code (php)
1
2
3
2
3
<?php
$sql = "SELECT custom_value FROM ras_virtuemart_product_customfields WHERE virtuemart_product_id = " . $virtuemart_product_id . " AND virtuemart_custom_id = (SELECT virtuemart_custom_id FROM ras_virtuemart_customs WHERE custom_title = 'kleur')";
?>
$sql = "SELECT custom_value FROM ras_virtuemart_product_customfields WHERE virtuemart_product_id = " . $virtuemart_product_id . " AND virtuemart_custom_id = (SELECT virtuemart_custom_id FROM ras_virtuemart_customs WHERE custom_title = 'kleur')";
?>
Gewijzigd op 09/10/2012 16:43:03 door Ozzie PHP
Gewoon met een join?
Hoe zou het dan worden en wat is het verschil met wat ik nu heb? Is een join beter?
Doe maar gewoon eens een EXPLAIN op beide mogelijkheden en je zal het verschil zien.
Gewijzigd op 09/10/2012 20:10:58 door Ger van Steenderen
Ah, oke... op die manier. Als iemand weet hoe die join query eruit moet zien, dan hoor ik het graag. En anders ga ik het morgen even uitpluizen.
Ik ben niet zeker over het stuk bij ON aangezien ik niet weet hoe je database in elkaar steekt.
Code (php)
1
2
3
4
2
3
4
SELECT custom_value, virtuemart_custom_id
FROM ras_virtuemart_product_customfields JOIN ras_virtuemart_customs
ON (ras_virtuemart_product_customfields.virtuemart_custom_id = ras_virtuemart_customs.virtuemart_custom_id)
WHERE virtuemart_product_id = " . $virtuemart_product_id . " AND custom_title = 'kleur'
FROM ras_virtuemart_product_customfields JOIN ras_virtuemart_customs
ON (ras_virtuemart_product_customfields.virtuemart_custom_id = ras_virtuemart_customs.virtuemart_custom_id)
WHERE virtuemart_product_id = " . $virtuemart_product_id . " AND custom_title = 'kleur'
Een klein voorbeeldje:
Als beide tabellen een veld bevatten met dezelfde naam dien je gebruik te maken van de volgende prefix:
Gewijzigd op 10/10/2012 01:29:19 door Ykcin Ykcin
Ik ga het straks uitproberen. Dankjewel Nicky!
WHERE virtuemart_product_id = " . $virtuemart_product_id . "
Levert dat via de unieke product-id niet altijd al één rij op?
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$query = "SELECT t1.custom_value
FROM ras_virtuemart_product_customfields AS t1
JOIN ras_virtuemart_customs AS t2
ON t1.virtuemart_custom_id = t2.virtuemart_custom_id
WHERE virtuemart_product_id = " . $virtuemart_product_id . " AND custom_title = 'kleur'";
?>
$query = "SELECT t1.custom_value
FROM ras_virtuemart_product_customfields AS t1
JOIN ras_virtuemart_customs AS t2
ON t1.virtuemart_custom_id = t2.virtuemart_custom_id
WHERE virtuemart_product_id = " . $virtuemart_product_id . " AND custom_title = 'kleur'";
?>
Bij het SELECT deel heb ik SELECT virtuemart_custom_id weggelaten. Mag dat? Ook zonder virtuemart_custom_id werkt het namelijk. Verder kreeg ik het alleen werkend als ik in het SELECT deel de kolomnaam aan custom_value toevoegde. Alleen custom_value werkte niet, maar t1.custom_value werkt wel. Waarom is dat?
Toevoeging op 10/10/2012 09:31:27:
@Ward: nee, die virtuemart_product_id komt meerdere malen voor (staat in een koppeltabel).
Ozzie PHP op 10/10/2012 09:30:21:
... Bij het SELECT deel heb ik SELECT virtuemart_custom_id weggelaten. Mag dat? ...
Ja zeker.
Daar zet je enkel de velden die naar php wilterugsturen.
Stel het je voor alsof mySQL fysiek op een aparte server staat. Dit is trouwens heel vaak echt het geval, online.
Als het niet nodig is dat die gegevens van de mySQL-server naar de apache-server worden gestuurd, moet je die velden niet naast SELECT zetten.
Ah, thanks... da's een prima tip! Zal ik onthouden!
[/quote]
Dat komt dat je meerdere tabellen in de querie gebruikt, zonder de tabelnaam voor de kolomnaam weet sql niet wat ie dan moet hebben
Oké... ik had gedacht dat sql dan zo slim zou zijn om de tabel te kiezen waar de betreffende kolom in voorkomt :)
BTW (6%)
Als je PK in de ene tabel en FK in de andere dezelfde naam hebben kan je ook simpelweg USING (kolomnaam) gebruiken ipv ON ... = ...
Ah oke, thanks voor de tip!!
omwille van die reden gebruik ik liever een alias te veel dan te weinig