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

标签 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 然后将它们加在一起。我有第一个这样的:

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/

相关文章:

mysql - 错误1048。Mysql查找表中的列不能为空-缺少什么?

mysql - : before a value in sql mean? 是什么意思

mysql - SQL 条件聚合函数

PHP 匹配 2 选定的表

mysql - 合并多个相似查询

mysql - 如何拥有一个可以独立于 azure 运行的完全独立的应用程序?

mysql - 与 Homebrew 版本的 mysql 和 mac 上的官方 mysql 首选项面板混淆

mysql - 如何在 MySQL 的多列唯一约束中将时间跨度指定为键?

php - 为什么 MySql 中有文本时没有值

php - 使用 find_in_set 从 1 行中选择包含值的列