2010-11-26 3 views
0

Je fais deux demandes, pour avoir une valeur. À mon avis, on serait plus rapide. Je pense que le meilleur moyen est d'utiliser join. Ceci est mon code:Jointure gauche, jointure interne, jointure de n'importe quoi?

$uid = db_query("SELECT uid FROM TABLE1 WHERE mail = '{$account->mail}' LIMIT 1"); 
$row = mysql_fetch_array($uid); 
$uid = $row[0]; 


$brief = db_query("SELECT value FROM Table2 WHERE uid = '{$uid}' AND fid = '16' LIMIT 1"); 
$row = mysql_fetch_array($brief); 
$brief = $row[0];` 

Comment puis-je fusionner ces deux demande à l'un?

Merci beaucoup à l'avance!

Répondre

2
SELECT value, ui 
     FROM TABLE1 T1 
INNER JOIN Table2 T2 
    USING (uid) 
    WHERE mail = '{$account->mail}' 
     AND fid = 16 
    LIMIT 1 

Mais vos requêtes sont bizarres. Est-ce que uid est unique? Est-ce que fid est unique? Sinon, il va sélectionner une ligne "aléatoire". Fondamentalement, ma requête joint TABLE1 avec Table2 en utilisant la colonne uid, et il ne prend que des lignes où mail = $ account-> mail et fid = 16. Donc, s'il y a plus d'une ligne, vous ne pouvez pas être sûr celui qui va être sélectionné.

0

La requête serait:

SELECT TABLE1.uid,TABLE2.value 
FROM TABLE1,TABLE2 
WHERE TABLE1.mail = '{$account->mail}' 
    AND TABLE2.uid = TABLE1.uid 
    AND TABLE2.fid = '16' 
LIMIT 1 

Saisissant les données de la ligne:

$uid = $row[0]; 
$brief = $row[1]; 
+2

Ceci est un produit cartésien. La variable $ uid provient de la première requête, je pense que vous vouliez écrire 'TABLE2.uid = TABLE1.uid'. Mais pour être honnête, je ne suis pas un fan de l'ancienne syntaxe, la syntaxe avec INNER JOIN (ou NATURAL INNER JOIN) est beaucoup plus claire. –

+0

@Vincent Savard: Oui, théoriquement c'est un produit cartésien, mais "LIMIT 1" ne l'empêche-t-il pas? – thejh

+0

@thejh: C'est toujours un produit cartésien, vous n'avez aucune idée de la ligne qui va être trouvée en premier. Mais ça ne marchera pas parce que $ uid n'existe pas (comme je l'ai dit, c'est à partir de sa première requête). –

0

D'autres ont fourni la syntaxe, donc je ne vais pas répéter cette partie. Mais pour savoir quel type de joint utiliser:

Pour obtenir littéralement ce que vous obtiendriez avec ce qui précède, vous utiliseriez un left join avec TABLE1 comme première table dans la jointure. Dans votre échantillon, vous obtenez toujours uid et vous pouvez obtenir value. Une jointure à gauche vous donnerait le même résultat en ce sens que vous obtiendriez toujours un résultat (uid) de TABLE1 et les lignes (value) qui correspondaient à TABLE2. Bien sûr, cela suppose qu'une valeur de a été trouvée.

Une note: Si je comprends son utilisation, en utilisant LIMIT 1 pourrait masquer un problème si vous n'avez pas une contrainte unique sur la colonne de courrier. S'il y avait deux lignes dans TABLE1 avec la même valeur de courrier, vous ne le sauriez jamais avec cette requête. Dans certains cas, cela peut être un bug dans votre système.

Questions connexes