J'essaie d'envelopper ma tête autour de cette question, mais je ne fais pas beaucoup de progrès. Mon objectif est de faire une joindre à gauche entre deux tables avec des critères de la bonne table. J'aimerais voir la liste de tous les produits et tarifs de la journée en cours, même s'il n'y a pas de rang de prix pour la journée en cours. Voici un exemple du code:
SELECT products.id, products.name, prices.price FROM products LEFT JOIN prices ON products.id = prices.id WHERE prices.date = CURRENT_DATE
3 Réponses :
supposer J'ai utilisé le fonction de date Pour supprimer la partie d'heure, car dans cet exemple, la date code> est appliquée em> avant em> la jointure est faite. C'est comme une table dérivée, filtrant les informations avant que la jointure soit faite - qui produira des résultats différents que si les critères ont été spécifiés dans la clause WHERE. P> Pour obtenir la liste des produits et des prix pour demain, utilisez: p> référence: p> prix.date code> est un type de données DateTime, utilisez:
actuel_date code> won ' t Inclure la partie temporelle tandis que DateTime enregistre. p>
La principale raison que cette solution fonctionne est que la condition de la table droite est placée dans les critères de jointure, de sorte que l'entrée de la table de gauche est renvoyée même lorsque la condition n'est pas satisfaite pour les enregistrements joints. Les gens pensent souvent à des critères de jointure comme reliant des colonnes dans une table aux colonnes d'une autre, mais elles peuvent également relier des colonnes d'une constante ou une contrainte donnée comme ici. Je ne peux pas insister suffisamment à quel point cette construction générale est utile, pour moi, elle revient encore et elle est souvent un moyen élégant et efficace de retourner exactement les données dont vous avez besoin sans recourir à des sous-sols.
SELECT id, name, (SELECT price FROM prices WHERE id = products.id AND prices.date = CURRENT_DATE ) AS price, (SELECT price FROM prices WHERE id = products.id AND prices.date = DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY) ) AS price_tomorrow FROM products
Réponses fortes ci-dessus. Ajout à la réponse des poneys OMG ... avoir des critères de table 'droit' dans l'original dans lequel l'instruction tourne essentiellement la jointure extérieure gauche dans une jointure intérieure. Juste une manière différente de la regarder cela pourrait aider. P>