2011-03-02 17 views
5

Tengo una base de datos MySQL con 2 tablas:MYSQL muestran 0, incluso si no existen resultados

countries 
results 
  • países es justa y id y una country name.
  • Resultados es un country_id, un value y un date.
  • No todos los países tienen resultados en cada fecha.

¿Cómo puedo crear una consulta que enumere todos los países con su resultado específico, pero todavía los liste y muestre 0 si no hay resultados en la tabla de resultados?

+0

O simplemente combínelo en una tabla, con valores nulos para los países que no tienen valor o fecha. – sevenseacat

Respuesta

6

Usar un LEFT JOIN entre las dos tablas

select c.id, c.name, IFNULL(r.value, 0) value, r.date 
from countries c 
LEFT JOIN results r on r.country_id = c.id 

Para mostrar 0 (para la columna de value) si no hay resultado, utilice IFNULL.

+0

genial, gracias por eso. ¿Qué tal si no quiero enumerar algunos de los países? – Jon

+0

Pones una cláusula Where al final, como la 4ª línea. – RichardTheKiwi

+0

Hola, probé este código ---- SELECCIONE r.staticistic, r.type, c.id, c.name, IFNULL (r.value, 0) value, r.date_from FROM dt_countries c LEFT JOIN resultados r en r.country = c.id ORDER BY estadística, tipo, nombre ---- pero algunos de los valores de "estadísticas" no coinciden con todos los contries. No mencioné que había 3 campos más en la tabla de resultados, no estoy seguro si eso hace una diferencia. – Jon

0

lo que estás buscando se llama LEFT JOIN. Eche un vistazo a this page o pregunte en google para un ejemplo fácil. para obtener más información, eche un vistazo a mysql documentation:

0

Con la siguiente consulta, obtendrá todos los países con los resultados asignados.

SELECT * 
    FROM countries AS c 
LEFT JOIN results AS r 
     ON r.country_id = c.id 

Si no hay valores asignados a algunos países, habrá null valores y según ellos sabrá que debe mostrar 0.

0

Si usted quiere tomar en cuenta todas las fechas que se almacenan en la tabla results y enumerar todos los países para todas aquellas fechas, en sustitución de results.value con 0 en consecuencia, entonces es posible que probablemente tendrá que hacer algo como esto:

SELECT 
    c.id, 
    IFNULL(r.value, 0) AS value, 
    r.date 
FROM countries c 
    CROSS JOIN (SELECT DISTINCT date FROM results) d 
    LEFT JOIN results r ON c.id = r.country_id AND d.date = r.date 
Cuestiones relacionadas