2016-08-21 3 views
1

Dies ist meine erste Frage, so dass ich entschuldige mich, wenn es nicht im richtigen Format ist. Ich habe ähnliche Antworten gefunden, aber sie erfordern spezifische Eingaben und ich bin nicht übermäßig erfahren in MySQL, um zu wissen, wie man sie herausnimmt.MYSQL Zählen und Gruppieren über zwei Spalten, wenn der Wert in einer Spalte vorhanden

Ich habe eine Tabelle wie folgt aus:

type | colourone | colourtwo 
-----+-----------+---------- 
car | red  | white 
car | red  | blue 
van | white  | NULL 
car | black  | NULL 
can | white  | black 

Ich versuche, alle Farben und ihnen Gruppe in einem SELECT zu zählen, aber über beide Spalten. Es spielt keine Rolle, in welcher Spalte eine Farbe erscheint, solange sie erscheint und gezählt wird. Das Ergebnis in etwa so aussehen würde:

red, 2 
white, 3 
blue, 1 
black, 2 

Die gleiche Farbe nicht in den beiden Spalten in einer Zeile angezeigt werden und einige Zeilen haben nur eine Farbe, daher die NULL in den zweiten. Ich habe etwas gefunden, das auf der richtigen Linie war, aber ich musste ein "IN()" verwenden, um Werte auszuwählen. Ich möchte sie nur zählen.

Ich kann eine Spalte vervollständigen, aber nicht wissen, wie die zweite Spalte mit einzubeziehen, ohne ein zweiten SELECT läuft sie dann zusammen addieren. Ich habe das erste wie folgt aus:

SELECT colourone, COUNT(*) AS 'num' FROM vehicle_tbl GROUP BY colourone 
+0

Das ist wirklich ganz einfach. Wir werden helfen ... aber versuchen Sie es !! – Strawberry

+0

Wie wäre es mit 'oder'. – Drew

+0

@Drew Nicht sicher über das!?! – Strawberry

Antwort

1

Hier ist meine or mit einer abgeleiteten Tabelle d. Die abgeleitete Tabelle d wurde mit einem union erstellt, um Nicht-Duplikat-Farben zu erhalten (im Gegensatz zu UNION ALL, die Duples zurückgibt). Wir brauchten nur eine Farbliste. Es würde NULL, aber als NULL wird nicht in der join kommen zurück, wir müssen nicht befürchten, dass.

Die Zählungen sind im thing - Ebene und verwendet daher die ID. Also, wenn für ein bestimmtes thing es sowohl rot und rot ist, wäre es nur einmal zählen (an der Sache Ebene).

Diese Randbedingung in den Daten nicht vorgelegt wurde. Ich bezweifle, dass es scheitern würde.

Beachten Sie, dass die Spaltennamen oder Aliase der ersten Unionsklausel diejenigen sind, die die gesamte Union verwendet. Das würde den faulen Ansatz im zweiten Teil erklären.

Schema:

create table thing 
( id int auto_increment primary key, 
    type varchar(100) not null, 
    colourone varchar(100) null, 
    colourtwo varchar(100) null 
); 
insert thing (type,colourone,colourtwo) values 
('car','red','white'), 
('car','red','blue'), 
('van','white',NULL), 
('car','black',NULL), 
('can','white','black'); 

query:

select d.color,count(t.id) as 'count' 
from 
( select colourone as 'color' from thing 
    union 
    select colourtwo from thing 
) d 
join thing t 
on t.colourone=d.color or t.colourtwo=d.color 
group by d.color 
order by d.color; 

Ergebnisse:

+-------+-------+ 
| color | count | 
+-------+-------+ 
| black |  2 | 
| blue |  1 | 
| red |  2 | 
| white |  3 | 
+-------+-------+ 
+0

Dank Drew. Diese Antwort hat mir sicherlich geholfen und ist sehr detailliert darin, dasselbe für andere wieder zu erreichen. –

+0

Ich werde es verbessern. War kurz von schäbig. – Drew

1

Das allgemeine Format der Abfrage könnte wie folgt aussehen ...

SELECT something, SOMETHING(something) 
    FROM 
    (SELECT something something FROM something 
     UNION ALL 
     SELECT soething FROM something 
    ) x 
GROUP 
    BY something; 
Verwandte Themen