2010-11-01 14 views
5

Penso di averlo fatto prima, ma potrebbe anche essere una funzione di PHP. Quello che vorrei è quello di fare una query MySQL (in un client di MySQL, non PHP) e per esempioMySQL: emettere solo alcuni valori una volta

Foo A 
     B 
     C 
Bar B 
     D 
     E 

Invece di

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

Questo sarebbe ovviamente solo rendere sence se è stato ordinato da quella prima colonna. Non sono sicuro se è possibile, ma come ho detto, voglio dire di ricordare di aver fatto questo una volta, ma non ricordo come o se è stato attraverso alcuni PHP "magica" ...


Aggiornamento : All'improvviso mi sono ricordato dove l'avevo usato. Quello che stavo pensando era il modificatore WITH ROLLUP per GROUP BY. Ma Ho anche scoperto che non fa quello che stavo pensando qui, quindi la mia domanda rimane valida. Anche se non penso che ci sia una soluzione ora. Ma le persone intelligenti hanno dimostrato fraintendetemi prima: P


Aggiornamento: dovrebbe probabilmente anche hanno detto che quello che voglio questo per è una relazione molti-a-molti. Nell'effettivo selezionare Foo sarebbe il primo nome di un partecipante e vorrei anche il cognome e alcune altre colonne. Le opzioni A, B, C, D, E sono le opzioni che il partecipante ha selezionato.

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

Cosa è accettabile - NULL, stringa di lunghezza zero? –

+0

Entrambi funzionerebbero probabilmente. – Svish

risposta

1

Questo vi darà

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

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

Cool, non conoscevo l'istruzione 'group_concat'. Supporta anche più colonne, ordinamento e separatore personalizzato ... Potrebbe finire usando questo ... – Svish

0

testato questo in SQL Server, ma penso che si tradurrà a 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

Avevo bisogno di alcune regolazioni, ma in realtà ha funzionato per questo esempio. Suppongo che richiederebbe uno di quei grossi blocchi del caso per ogni colonna che potrebbe essere duplicata anche se ...? – Svish