2012-06-01 3 views
0

Ce que je veux faire est d'interroger trois tables séparées dans une rangée qui est identifiée par une référence unique. Je n'ai pas vraiment la pleine compréhension de la clause Join car il semble exiger une sorte de données connexes de chaque table. Je sais que je peux m'y prendre au long cours, mais je ne peux pas me permettre de perdre un peu d'efficacité. Toute aide serait grandement appréciée.Mysql Requête pour vérifier 3 tables pour une ligne existante

Tableau Structure

package_id int(8), 
    client_id int(8), 
    unique reference varchar (40) 

Chacune des tables ont essentiellement la même structure. J'ai juste besoin de savoir comment interroger tous les trois, pour 1 ligne.

+4

mettre la structure de la table pour référence .. sans elle, comment peut-on vous suggérer quelque chose? –

+1

http://www.whathaveyoutried.com – pduersteler

+0

J'ai essayé un certain nombre de choses, en utilisant principalement 'Join' mais mes connaissances sur ce sujet sont limitées. Et il semble qu'ils ont tous besoin de données connexes, mais aucune de ces données n'a de relation quelconque. – scottevans93

Répondre

0

Disons que vous avez 3 tables:

table1, Table2 et Table3 avec la structure

package_id int(8), 
client_id int(8), 
unique reference varchar (40) 

Supposons que la référence de la colonne est la clé unique.

Ensuite, vous pouvez utiliser ceci:

SELECT t1.exists_row ,t2.exists_row ,t3.exists_row FROM 
(
    (SELECT COUNT(1) as exists_row FROM table1 t1 WHERE 
     t1.reference = @reference) t1, 
    (SELECT COUNT(1) as exists_row FROM table1 t2 WHERE 
     t2.reference = @reference) t2, 
    (SELECT COUNT(1) as exists_row FROM table1 t3 WHERE 
     t3.reference = @reference) t3 
) a 

;

Remplacer @reference avec la valeur réelle de clé unique

ou lorsque vous fournissez la sortie de

SHOW CREATE TABLE 

Je peux réécrire SQL avec requête réelle

0
SELECT * FROM table1 t1 JOIN table2 t2 ON (t2.unique = t1.unique) JOIN table3 t3 ON (t3.unique = t1.unique) WHERE t1.unique = '?'; 

Vous pouvez utiliser un JOIN comme ceci, en supposant que les trois tables ont la même colonne unique.

+0

Que faire si la valeur de référence se trouve uniquement dans la table2? –

+0

Désolé, je n'avais pas réalisé que c'était une condition. En utilisant un INNER JOIN (JOIN) cela devrait être accompli. Si seulement la table2 a la valeur, rien ne sera retourné. Toutes les tables doivent correspondre à la condition – Rawkode

0

Si vous avez peu de tables partageant la même définition ou une définition similaire, vous pouvez utiliser union ou union pour les traiter comme une seule. Cette requête retournera des lignes de chaque table ayant la référence demandée. J'ai inclus OriginTable info au cas où votre code devra se référer à la table d'origine pour la mise à jour ou autre chose.

select 'TableA' OriginTable, 
     package_id, 
     client_id 
    from TableA 
where reference = ? 
union all 
select 'TableB' OriginTable, 
     package_id, 
     client_id 
    from TableB 
where reference = ? 
union all 
select 'TableC' OriginTable, 
     package_id, 
     client_id 
    from TableC 
where reference = ? 

Vous pouvez étendre la liste de sélection avec d'autres colonnes, à condition qu'ils aient le même type de données, ou sont implicitement convertibles en type de données de la première sélection.

0

Il est tout à fait possible de créer une jointure entre des tables en utilisant une clause where. En fait, c'est souvent ce que je fais car je trouve que cela conduit à des informations plus claires sur ce que vous faites réellement, et si vous n'obtenez pas les résultats que vous attendez, vous pouvez déboguer petit à petit.

Cela dit, une jointure est certainement beaucoup plus rapide à écrire! S'il vous plaît gardez à l'esprit que je suis un rouillé sur SQL donc j'ai peut-être manqué oublié, et je ne vais pas inclure de code car vous n'avez pas dit quel SGBD vous utilisez car ils ont tous légèrement différent code. La chose à retenir est que la jointure fonctionne sur une colonne avec les mêmes données (et type) en son sein.

Il est beaucoup plus facile si chaque table a le champ « se joindre » porte le même nom, alors il devrait être une question de

join on <nameOfField> 

Toutefois, si vous souhaitez utiliser le champ qui ont des noms différents dans les différentes tables vous aurez besoin de lister les noms complets. ie tableName.FieldName

Si vous avez des problèmes avec le naturel, intérieur et extérieur, gauche et droite, vous devez penser à un diagramme de Venn avec le naturel étant le point de communité entre les tables. Si vous n'utilisez que 2 tables intérieures et extérieures sont équivalentes à gauche et à droite (chaque tableau étant un seul cercle dans le diagramme de Venn) et gauche et droite étant l'ordre des tables dans votre liste dans la partie principale de votre sélection (la première étant la gauche et la seconde étant la droite). Lorsque vous ajoutez un troisième tableau, vous pouvez sélectionner l'une des sections croisées en utilisant ces mots-clés. Encore une fois cependant, j'ai toujours trouvé plus facile de faire une sélection primaire et de créer une table temporaire, puis d'effectuer ma prochaine jointure en utilisant cette table temporaire (donc seulement besoin d'utiliser naturel ou gauche et droite). Encore une fois, je trouve cela plus facile à déboguer.

La meilleure chose est d'expérimenter et de voir ce que vous obtenez en retour. Sans un diagramme de vos tableaux, c'est le meilleur que je puisse vous offrir.

en bref ...

sélectionne imbriquées où le champ = (sélectionner de la table où le champ =)

et tables temporaires

sont (je pense) plus facile à déboguer ... mais ne prends plus d'écriture!

David.

0
array_of_tables[]; // contain name of each table 

foreach(array_of_tables as $val) 
{ 
    $query="select * from `$val` where $condition "; // $conditon 
    $result=mysqli_query($connection,$query); 
    $result_row[]=mysqli_fetch_assoc($result); // if only one row going to return form each table 
    //check resulting array ,for your row 
} 
+0

Mais comme je l'ai dit, je veux m'éloigner de plusieurs requêtes. – scottevans93