这是我的第一个问题,所以如果格式不正确,我会道歉。我找到了类似的答案,但它们需要特定的输入,而且我在MySQL中没有过多的经验知道如何将它们拿出来。
我有一张这样的表:
type | colourone | colourtwo
-----+-----------+----------
car | red | white
car | red | blue
van | white | NULL
car | black | NULL
can | white | black
我尝试计算所有颜色并将它们分组在一个SELECT中,但是在两个列中。只要它出现并被计数,颜色出现在哪一列上并不重要。 结果看起来像这样:
red, 2
white, 3
blue, 1
black, 2
相同的颜色不会出现在一行的两列中,而某些行只有一种颜色,因此第二行中的NULL。我确实找到了合适的东西,但要求我使用" IN()"挑出价值观。我只想数数。
我可以填写一列但不知道如何让第二列参与,而不运行第二列然后将它们一起添加。我有第一个这样的:
SELECT colourone,
COUNT(*) AS 'num'
FROM vehicle_tbl
GROUP BY colourone
答案 0 :(得分:1)
查询的一般格式可能如下所示......
{{1}}
答案 1 :(得分:1)
这是我的or
,其中包含派生表d
。派生表d
使用union
构造,以获得非重复颜色(而不是返回dupes的UNION ALL
)。我们只需要一个颜色列表。它将包含NULL,但由于NULL不会加入join
,我们不必担心。
计数位于thing
级别,因此使用了ID。因此,如果对于给定的thing
,它既是红色也是红色,它只会计算一次(在事物级别)。
数据中未显示该边缘条件。我怀疑它会失败。
请注意,第一个union子句的列名或别名是整个union使用的列名或别名。这可以解释第二个联盟部分中的懒惰方法。
架构:
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');
查询:
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;
结果:
+-------+-------+
| color | count |
+-------+-------+
| black | 2 |
| blue | 1 |
| red | 2 |
| white | 3 |
+-------+-------+