2010-11-01 12 views
5

Ich denke, ich habe das schon einmal gemacht, aber es könnte auch eine Funktion von PHP sein. Was ich möchte, ist eine MySQL-Abfrage (in einem MySQL-Client, nicht PHP) zu tun und bekommt zum BeispielMySQL: Nur einige Werte einmal ausgeben

Foo A 
     B 
     C 
Bar B 
     D 
     E 

Statt

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

Dies würde Sinn natürlich nur machen, wenn es bestellt wurde durch diese erste Spalte. Nicht sicher, ob es möglich ist, aber wie ich schon sagte, ich meine erinnern, dies einmal getan haben, aber kann mich nicht erinnern, wie oder ob es durch einige PHP „Magie“ war ...


-Update : Plötzlich erinnerte ich mich, wo ich es benutzt hatte. Was ich dachte, war der WITH ROLLUP Modifikator für GROUP BY. Aber Ich entdeckte auch, dass es nicht tut, was ich hier dachte, also meine Frage steht noch. Obwohl ich denke, dass es keine Lösung gibt. Aber intelligente Menschen haben bewiesen, mir falsch vor: P


Update: Sollte wahrscheinlich auch erwähnt, dass, was ich dies wollen für eine many-to-many-Beziehung. In der tatsächlichen Auswahl Foo wäre der Vorname eines Teilnehmers und ich möchte auch Nachname und einige andere Spalten. Die Optionen A, B, C, D, E sind Optionen, die der Teilnehmer ausgewählt hat.

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

Was ist akzeptabel - NULL, Nulllänge Zeichenfolge? –

+0

Beide würden wahrscheinlich funktionieren. – Svish

Antwort

1

Dies wird Ihnen

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

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

Cool, wusste nicht über die 'group_concat' Aussage. Sogar unterstützt mehrere Spalten, Reihenfolge und benutzerdefinierte Trennzeichen ... Könnte am Ende mit dieser ... – Svish

0

dies in SQL Server getestet geben, aber ich denke, es ist zu MySQL übersetzen.

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

Benötigt einige Anpassungen, aber tatsächlich für dieses Beispiel gearbeitet. Vermute, es würde einen dieser großen 'Case'-Blöcke für jede Spalte erfordern, die dupliziert werden könntest, obwohl ...? – Svish