2010-11-01 18 views
5

Creo que ya lo he hecho antes, pero también podría ser una función de PHP. Lo que me gustaría es hacer una consulta MySQL (en un cliente de MySQL, no PHP) y obtener, por ejemplo,MySQL: solo muestra algunos valores una vez

Foo A 
     B 
     C 
Bar B 
     D 
     E 

En lugar de

Foo A 
Foo B 
Foo C 
Bar B 
Bar D 
Bar E 

Por supuesto, esto sólo haría SENCE si se ordenó por esa primera columna. No estoy seguro si es posible, pero como he dicho, quiero decir que hay que recordar haber hecho esto una vez, pero no puede recordar cómo o si fue a través de algo de PHP "mágica" ...


actualización : De repente recordé dónde lo había usado. Lo que estaba pensando era en el modificador WITH ROLLUP para GROUP BY. Pero También descubrí que no hace lo que estaba pensando aquí, por lo que mi pregunta sigue en pie. Aunque no creo que haya una solución ahora. Pero las personas inteligentes han demostrado que estoy equivocado antes: P


Actualización: probablemente debería también han mencionado que lo que yo quiero esto para una relación de muchos a muchos. En la selección real, Foo sería el nombre de un asistente y también me gustaría el apellido y algunas otras columnas. Las A, B, C, D, E son opciones que el asistente ha seleccionado.

attendee (id, first_name, last_name, ...) 
attendees_options (attendee_id, option_id) 
option (id, name, description) 
+0

¿Qué es aceptable - NULL, cadena de longitud cero? –

+0

Ambos funcionarían probablemente. – Svish

Respuesta

1

Esto le dará

Foo A,B,C 
Bar B,D,E  

SELECT column1, GROUP_CONCAT(column2) FROM table GROUP BY column1 
+0

Cool, no sabía acerca de la declaración 'group_concat'. Incluso admite columnas múltiples, pedidos y separadores personalizados ... Podría terminar usando esto ... – Svish

0

a prueba esta en SQL Server, pero creo que se traducirá en MySQL.

create table test (
    id int, 
    col1 char(3), 
    col2 char(1) 
) 

insert into test 
    (id, col1, col2) 
    select 1, 'Foo', 'A' union all 
    select 2, 'Foo', 'B' union all 
    select 3, 'Foo', 'C' union all 
    select 4, 'Bar', 'D' union all 
    select 5, 'Bar', 'E' union all 
    select 6, 'Bar', 'F' 

select case when t.id = (select top 1 t2.id 
          from test t2 
          where t2.col1 = t.col1 
          order by t2.col1, t2.col2) 
      then t.col1 
      else '' 
     end as col1, 
     t.col2 
    from test t 
    order by t.id 

drop table test 
+0

Se necesitaron algunos ajustes, pero en realidad funcionó para este ejemplo. ¿Adivina que requeriría uno de esos grandes bloques de 'casos' para cada columna que podría duplicarse ...? – Svish

Cuestiones relacionadas