2011-03-02 6 views
0

J'ai 2 tablesproblème LEFT JOIN MySQL

countries: 
id, name 

results: 
id, stat, type, country, value, date 

stat peut être l'une des 10 valeurs et type un des 2. Country est l'identifiant du pays sur la table countries.

Les résultats pour une date précise ne comprennent pas tous les pays.

Comment puis-je créer un LEFT JOIN afin que tous les pays sont répertoriés pour CHAQUE stat - combinaison type, donc si un pays n'a pas alors 0 (ou NULL) seront affichés.

J'ai essayé SELECT * FROM dt_countries c LEFT JOIN results r ON c.id = r.country comme test, mais il ne montre pas les résultats que je veux.

grâce

+0

sont les stats/types énumérés dans une autre table ou des tables que nous pourrions tirer parti ici? –

+0

Avez-vous une table avec les types de résultat et une autre table avec les valeurs de résultat? – linepogl

+0

Est-ce que les statistiques/types existent dans une autre table que nous pourrions exploiter ici? non, c'est la seule table – Jon

Répondre

0

Vous n'avez pas la structure de la table pour soutenir le faire (ou, si vous le faites, vous n'avez pas le tableau ci). Ce que vous devez faire ce que vous êtes après est trois tables:

  • pays
  • résultats
  • pays Résultats

(Pour votre information, les tables SQL sont généralement nommés dans singulier, c'est-à-dire Country, Result, CountryResult, etc.)

Ce que vous avez énuméré est juste l'équivalent de les tables Country et CountryResult.

Si vous aviez la troisième table, vous feriez faire quelque chose comme ceci:

select 
    c.Name as Country, 
    r.Name as Result, 
    cr.Value as Value 

from Country c 

cross join Result r -- We WANT a cartesian product 
left join CountryResult cr on cr.CountryId = c.CountryId and cr.ResultId = r.ResultId 
+0

Donc, je devrais créer sur la table avec la liste de type de stat? – Jon

+0

Ai-je quelque chose de bizarre à propos de MySQL? Si vous voulez un produit cartésien, ne faites-vous normalement pas un CROSS JOIN et ne devez pas faire des choses bizarres comme "1 = 1"? –

+1

@Matt: Oui, vous utiliseriez habituellement un 'CROSS JOIN'. Pour une raison quelconque, j'avais dans ma tête que MySQL ne les supportait pas, mais cela semble inexact. J'ai édité ma réponse; Merci! –

0

utilisation LEFT OUTER JOIN

SELECT * 
FROM results r 
LEFT OUTER JOIN dt_countries c 
    ON c.id = r.country 
+0

-1. Cela ne fera pas ce que le PO demande; ceci ne listera que les résultats qui n'ont pas de 'country' valide. Il n'indiquera pas les résultats qui n'existent pas. –

+0

il donne les mêmes résultats dans un ordre différent. – Jon

0
select st.stat, st.type, r.date, c.name, r.value 
from 
(select distinct stat, type from results) st 
cross join dt_countries c 
left outer join results r on 
    c.id = r.country and r.stat = st.stat and r.type = st.type 
order by st.stat, st.type, r.date, c.name