2012-08-24 26 views
7

Tengo una tabla de MySQL como estoAdición de una fila adicional para el resultado de MySQL consulta de selección

id Name count 
1 ABC 1 
2 CDF 3 
3 FGH 4 

mediante consulta, simplemente seleccione consigo los valores como

1 ABC 1 
2 CDF 3 
3 FGH 4 

¿Cómo puedo conseguir el resultado como este

1 ABC 1 
2 CDF 3 
3 FGH 4 
4 NULL 0 

Puedes ver la Última fila. Cuando se terminan los registros, se debe agregar una fila adicional en este formato last_id+1, Null ,0. Puedes ver arriba. Incluso yo no tengo esa fila en mi tabla original. Puede haber N filas no fijadas 3,4

+1

no se puede. Hasta que realmente exista en la mesa. – hjpotter92

+0

@ Nerd-Herd No estoy seguro de que sea cierto. –

+1

@ Nerd-Herd Estoy seguro de que no es cierto. – GolezTrol

Respuesta

2

Esto se ve un poco desordenado pero debería funcionar.

SELECT a.id, b.name, coalesce(b.`count`) as `count` 
FROM 
    (
    SELECT 1 as ID 
    UNION 
    SELECT 2 as ID 
    UNION 
    SELECT 3 as ID 
    UNION 
    SELECT 4 as ID 
    ) a LEFT JOIN table1 b 
     ON a.id = b.id 
WHERE a.ID IN (1,2,3,4) 

ACTUALIZA 1

Simplemente podría generar una tabla que tiene 1 columna de preferencia con el nombre (ID ) que tiene registros quizá hasta 10.000 o más. Entonces simplemente podrías unirte a tu mesa que tenga el registro original. Por ejemplo, asumiendo que tiene una tabla llamada DummyRecord con 1 columna y tiene 10.000 filas en él

SELECT a.id, b.name, coalesce(b.`count`) as `count` 
FROM DummyRecord a LEFT JOIN table1 b 
     ON a.id = b.id 
WHERE a.ID >= 1 AND 
     a.ID <= 4 

eso es todo. O si usted quiere tener de 10 a 100, entonces se podría utilizar esta condición

... 
WHERE a.ID >= 10 AND 
     a.ID <= 100 
+0

La tabla tiene muchas filas no solo de una a 4. debemos tomarlo dinámicamente – Warrior

+0

@ Guerrero ah, vale, ya lo entiendo. Acabo de actualizar la respuesta. :) –

0
select 
    x.id, 
    t.name, 
    ifnull(t.count, 0) as count 
from 
    (SELECT 1 AS id 
    -- Part of the query below, you will need to generate dynamically, 
    -- just as you would otherwise need to generate 'in (1,2,3,4)' 
    UNION ALL SELECT 2 
    UNION ALL SELECT 3 
    UNION ALL SELECT 4 
    UNION ALL SELECT 5 
) x 
    LEFT JOIN YourTable t 
    ON t.id = x.id 
0

Si el id no existe en la tabla que está seleccionando a partir, tendrá que LEFT JOIN contra una una lista de cada id que desea devolver; de esta manera, devolverá los valores null para los que no existen y los valores verdaderos para aquellos que sí lo hacen.

que sugeriría la creación de una mesa numbers que es una sola tabla de columnas llenas con los números:

CREATE TABLE `numbers` (
    id int(11) unsigned NOT NULL 
); 

Y luego insertar una gran cantidad de números, a partir de las 1 y subiendo a lo que piensa la más alta id que jamás verá, más de mil más o menos. Tal vez vaya de 1 a 1000000 para estar seguro. De todos modos, solo necesita asegurarse de que sea lo suficientemente alto como para cubrir cualquier posible id que se encuentre.

Después de eso, la consulta puede ser:

SELECT n.id, a.* 
FROM 
    `numbers` n 
    LEFT JOIN table t 
     ON t.id = n.id 
WHERE n.id IN (1,2,3,4); 

Esta solución permitirá una lista dinámica creciente de ids sin la necesidad de una sub-consulta con una lista de los sindicatos; sin embargo, las otras soluciones proporcionadas también funcionarán para una pequeña lista conocida (y también podrían generarse dinámicamente).

+0

No debe olvidar asegurarse de que la tabla de números sea lo suficientemente grande. Esto es algo que se puede olvidar fácilmente, si alguien decide poner 'cerca de un millón' de registros en él, y después de unos años la otra tabla crece a más de un millón. (Sí, eso sucede!) Pero de lo contrario es una buena alternativa a mi respuesta. Sin embargo, todavía necesita 'generar' una parte de la consulta (la lista de números), por lo que no es mucho más fácil. – GolezTrol

2

Simplemente use mysql ROLLUP.

SELECT * FROM your_table 
     GROUP BY Name WITH ROLLUP; 
5

La respuesta es muy simple

select (select max(id) from mytable)+1 as id, NULL as Name, 0 as count union all select id,Name,count from mytable; 
+0

Esta es la respuesta más precisa que he encontrado. – Ronu

Cuestiones relacionadas