2011-03-09 6 views
1

J'ai besoin d'une requête pour obtenir des résultats, en utilisant deux tables différentes. L'entrée est $tagID, donnée à partir d'un $ _GET. La première table, coupons_tags, a un champ pour tagID et un champ pour couponID. La deuxième table, les coupons, a un champ pour couponID et le reste des champs sont l'information que je veux.Problème lors de l'écriture d'une requête compliquée avec MySQL

Comment exécuter une requête qui peut trouver tous les coupons correspondant à la variable d'entrée à partir de $ _GET, en fonction des informations que j'ai fournies? J'ai eu ce semi-travail en utilisant plusieurs requêtes, mais le code était terrible, car je suis nouveau pour les requêtes multi-tables. J'utilise MySQL et PHP.

+0

afficher les définitions de tables avec étiquettes et cupons – bensiu

Répondre

1

Voici le début de la requête SQL. Je suis sûr de savoir comment l'appeler en PHP si.

SELECT coupons.something, coupons.somethingelse 
FROM coupons_tags, coupons 
WHERE coupons_tags.coupons_id = coupons.coupons_id 
    AND coupons_tags.tag_id = $tagID 

Vous pouvez penser que les tables sont mis « côte à côte » de sorte que chaque rangée horizontale a la même coupons_id dans les deux tables.

La deuxième clause where filtre les balises que vous ne souhaitez pas.

2

Alors que la solution jkj vous a fourni fonctionne, il utilise une ancienne façon de joindre des tables, qui dans les mélanges particuliers se joignent à des conditions et des conditions de filtrage dans une clause, à savoir la clause WHERE.

La méthode d'assemblage actuellement proposée propose des mots-clés dédiés qui vous permettent de séparer la logique de jointure de la logique de filtrage, rendant ainsi votre requête plus claire, j'ose dire.

Voilà comment vous iriez selon les normes en vigueur:

SELECT c.* 
FROM coupons_tags ct 
    INNER JOIN coupons c ON ct.couponID = c.couponID 
WHERE ct.tagID = $tagID 

Ici, vous indiquez la jonction avec la clause INNER JOIN et de mettre la condition de jointure, ct.couponID = c.couponID, après le mot-clé ON, laissant ainsi la condition de filtre, ct.tagID = $tagID, dans la clause WHERE.

Cette solution contient également des alias de table (ct, c), qui vous aident également à rendre votre script plus lisible lorsque vous devez interroger plusieurs tables.

Si, lors de l'interrogation de plusieurs tables, vous spécifiez certaines colonnes à sélectionner au lieu de seulement * ou alias.*, comme je l'ai fait, n'oubliez pas d'inclure l'alias de table aussi. Ce n'est pas toujours nécessaire, car certaines colonnes ne sont présentes que dans l'une des tables que vous interrogez et le moteur de base de données ne sera pas confondu en déterminant à quelle table vous voulez que cette colonne appartienne, mais c'est toujours une bonne pratique l'alias attaché, car il améliore encore la lisibilité ainsi que la maintenabilité de vos scripts.