2010-11-01 4 views
5

Je pense que je l'ai fait auparavant, mais cela pourrait aussi être une fonction de PHP. Ce que je voudrais est de faire une requête MySQL (dans un client MySQL, pas de PHP) et obtenir par exempleMySQL: N'affiche que quelques valeurs une fois

Foo A 
     B 
     C 
Bar B 
     D 
     E 

Au lieu de

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

Ce serait bien sûr que faire sence si elle a reçu l'ordre par cette première colonne. Je ne sais pas s'il est possible, mais comme je l'ai dit, je veux dire de se rappeler avoir fait une fois, mais ne peut pas se rappeler comment ou si elle était par quelque PHP « magique » ...


Mise à jour : Soudainement rappelé où je l'avais utilisé. Ce à quoi je pensais était le modificateur WITH ROLLUP pour GROUP BY. Mais J'ai aussi découvert que ça ne fait pas ce que je pensais ici, donc ma question est toujours là. Bien que je ne pense pas qu'il existe une solution maintenant. Mais les gens intelligents me ont donné tort avant: P


Mise à jour: aurait probablement dû aussi mentionné que ce que je veux cela pour un grand nombre à plusieurs. Dans la sélection actuelle Foo serait le prénom d'un participant et je voudrais aussi le nom de famille et d'autres colonnes. Les options A, B, C, D, E sont les options que le participant a sélectionnées.

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

Qu'est-ce qui est acceptable - Chaîne nulle de longueur nulle? –

+0

Les deux fonctionneraient probablement. – Svish

Répondre

1

Cela vous donnera

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

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

Cool, ne connaissait pas l'instruction 'group_concat'. Même prend en charge plusieurs colonnes, la commande et le séparateur personnalisé ... Pourrait finir en utilisant cela ... – Svish

0

testé ce dans SQL Server, mais je pense que ça va se traduire par 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

Besoin de quelques ajustements, mais a effectivement travaillé pour cet exemple. Je suppose qu'il faudrait un de ces gros blocs 'case' pour chaque colonne qui pourrait être dupliquée si ...? – Svish

Questions connexes