query in query?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ozzie PHP

Ozzie PHP

09/10/2012 16:41:12
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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')";
?>
Gewijzigd op 09/10/2012 16:43:03 door Ozzie PHP
 
PHP hulp

PHP hulp

23/12/2024 19:54:53
 
Jaron T

Jaron T

09/10/2012 18:36:47
Quote Anchor link
Gewoon met een join?
 
Ozzie PHP

Ozzie PHP

09/10/2012 19:55:29
Quote Anchor link
Hoe zou het dan worden en wat is het verschil met wat ik nu heb? Is een join beter?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

09/10/2012 20:10:10
Quote Anchor link
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.
Gewijzigd op 09/10/2012 20:10:58 door Ger van Steenderen
 
Ozzie PHP

Ozzie PHP

09/10/2012 20:48:06
Quote Anchor link
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.
 
Ykcin Ykcin

Ykcin Ykcin

10/10/2012 01:26:02
Quote Anchor link
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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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'


Een klein voorbeeldje:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT colum(s)
FROM table1 JOIN table2
ON (primarykey = foreignkey)


Als beide tabellen een veld bevatten met dezelfde naam dien je gebruik te maken van de volgende prefix:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
table1.id = table2.id
//dus niet
id = id
Gewijzigd op 10/10/2012 01:29:19 door Ykcin Ykcin
 
Ozzie PHP

Ozzie PHP

10/10/2012 06:14:49
Quote Anchor link
Ik ga het straks uitproberen. Dankjewel Nicky!
 
Ward van der Put
Moderator

Ward van der Put

10/10/2012 09:26:07
Quote Anchor link
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?
 
Ozzie PHP

Ozzie PHP

10/10/2012 09:30:21
Quote Anchor link
Uiteindelijk is de query als volgt geworden en nu werkt het. Toch nog een paar vragen... Dit is de query:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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'";
?>


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).
 
Kris Peeters

Kris Peeters

10/10/2012 10:31:10
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

10/10/2012 10:36:48
Quote Anchor link
Ah, thanks... da's een prima tip! Zal ik onthouden!
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

10/10/2012 18:09:28
Quote Anchor link
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
 
Ozzie PHP

Ozzie PHP

10/10/2012 18:18:37
Quote Anchor link
Oké... ik had gedacht dat sql dan zo slim zou zijn om de tabel te kiezen waar de betreffende kolom in voorkomt :)
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

10/10/2012 19:28:50
Quote Anchor link
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 ... = ...
 
Ozzie PHP

Ozzie PHP

10/10/2012 19:50:37
Quote Anchor link
Ah oke, thanks voor de tip!!
 
Kris Peeters

Kris Peeters

10/10/2012 21:43:55
Quote Anchor link
omwille van die reden gebruik ik liever een alias te veel dan te weinig
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.