J'ai une base de données avec trois tables:Comment réparer cette requête SQL simple?
- user_table
- country_table
- city_table
Je veux écrire ANSI SQL qui me permettra de récupérer toutes les données utilisateur (c.-à-utilisateur détails incluant le nom du pays de la dernière école et le nom de la ville où ils habitent maintenant). Le problème que j'ai est que je dois utiliser une auto-jointure, et je suis un peu confus.
Le schéma est illustré ci-dessous:
CREATE TABLE user_table (id int, first_name varchar(16), last_school_country_id int, city_id int);
CREATE TABLE country_table (id int, name varchar(32));
CREATE TABLE city_table (id int, country_id int, name varchar(32));
Ceci est la requête que je suis venu avec jusqu'à présent, mais les résultats sont mauvais, et parfois, le moteur db (mySQL), me demande si je veux pour montrer tous les résultats [ÉNORME NUMÉRO HERE] - ce qui me fait penser que je crée involontairement un produit cartésien quelque part. Est-ce que quelqu'un peut expliquer ce qui ne va pas avec cette instruction SQL, et ce que je dois faire pour le réparer?
SELECT usr.id AS id, usr.first_name, ctry1.name as loc_country_name, ctry2.name as school_country_name, city.name as loc_city_name
FROM user_table usr, country_table ctry1, country_table ctry2, city_table city
WHERE usr.last_school_country_id=ctry2.id
AND usr.city_id=city.id
AND city.country_id=ctry1.id
AND ctry1.id=ctry2.id;
Êtes-vous sûr que 'ctry1.id = ctry2.id' est correct? –
Vous n'avez pas besoin d'une auto-jointure, et vous en utilisez une, mais cela ne vous apporte rien de nouveau. Êtes-vous en train de dire que vous «devez utiliser une auto-adhésion» parce que cela fait partie de la mission? – MJB
@MJB: mon SQL peut être rouillé, mais je pense que j'ai besoin d'une auto-participation. La raison en est que le pays de l'école et le pays actuel (dérivé de la ville actuelle) peuvent être différents. – morpheous