这是我的第一个问题,如果格式不正确,我深表歉意。我找到了类似的答案,但它们需要特定的输入,而且我在 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 然后将它们加在一起。我有第一个这样的:
SELECT colourone,
COUNT(*) AS 'num'
FROM vehicle_tbl
GROUP BY colourone
最佳答案
这是我的或
派生表d
。派生表 d
是用 union
构建的,以获取非欺骗颜色(与返回欺骗的 UNION ALL
相反)。我们只需要一个颜色列表。它会包含 NULL,但由于 NULL 不会在 join
中返回,所以我们不必担心。
计数在 thing
- 级别,因此使用了 id。因此,如果对于给定的 thing
,它既是红色又是红色,则它只会计数一次(在事物级别)。
该边缘条件未出现在数据中。我怀疑它会失败。
请注意,第一个联合子句的列名或别名是整个联合使用的。这将解释第二个联合部分中的惰性方法。
架构:
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 |
+-------+-------+
关于如果任一列中存在值,则 MYSQL 跨两列进行计数和分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39069014/