query in query?
Hallo mensen, ik heb zojuist een query gemaakt... en hij werkt prima :)
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:
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?
Ja, in het algemeen kun je stellen dat joins beter zijn dan een subquery in de where clause omdat dan de subquery op elke rij uitgevoerd moet worden die tegen gekomen wordt die voldoet aan de andere filter voorwaarden.
Doe maar gewoon eens een EXPLAIN op beide mogelijkheden en je zal het verschil zien.
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.
Dit zou de syntax van de join query zijn.
Ik ben niet zeker over het stuk bij ON aangezien ik niet weet hoe je database in elkaar steekt.
Een klein voorbeeldje:
Als beide tabellen een veld bevatten met dezelfde naam dien je gebruik te maken van de volgende prefix:
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!
In je eerste query valt deze conditie op:
WHERE virtuemart_product_id = " . $virtuemart_product_id . "
Levert dat via de unieke product-id niet altijd al één rij op?
WHERE virtuemart_product_id = " . $virtuemart_product_id . "
Levert dat via de unieke product-id niet altijd al één rij op?
Uiteindelijk is de query als volgt geworden en nu werkt het. Toch nog een paar vragen... Dit is de query:
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).
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!
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?
[/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
[/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 :)
SQL is wel slim maar niet helderziend ;-) Jij bent nl zo verstandig geweest om in je kolomnamen verband te leggen met de tabel waar ze in staan (behalve de FK's), maar niet iedereen doet dat. En dat is nu juist de reden dat ik er altijd zo op hamer om geen SELECT * te gebruiken, want met joins krijg je dan hele onverwachte dingen met fetch_assoc
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 ... = ...
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




