MYSQL如果任一列中存在值,则对两列进行计数和分组

时间:2016-08-21 21:26:49

标签: mysql

这是我的第一个问题,所以如果格式不正确,我会道歉。我找到了类似的答案,但它们需要特定的输入,而且我在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

2 个答案:

答案 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 |
+-------+-------+