如果您能帮助我计算 MySql 中 SET 类型的唯一值,我将不胜感激。我有一个名为“features”的列定义为一个 SET 字段,如下所示:
CREATE TABLE cars (features SET('power steering', 'power locks', 'satellite radio', 'power windows', 'sat nav', 'turbo'));
当我填写此表时,由于这些特征并不相互排斥,因此我将获得包含这些特征中的 2 个或更多个组合的记录。例如:
汽车 1 有动力转向和电动车窗,但没有其他功能。 汽车 2 具有所有功能。 汽车 3 具有所有功能,但卫星导航和涡轮增压除外。
我想要做的是获取表中所有单个列出的特征的列表,包括以与使用 GROUP BY 子句的 SELECT 语句类似的方式关联到每个特征的记录数。因此,按照上面的示例,我应该能够得到以下结果:
features |count
---------------+------
power steering | 3 //All cars have this feature
power locks | 2 //Only cars 2 and 3 have it
satellite radio| 2 //Only cars 2 and 3 have it
power windows | 3
sat nav | 1 //only car 2 has it
turbo | 1 //only car 2 has it
我已经尝试使用以下查询来获得上述结果:
SELECT features, COUNT(features) FROM cars GROUP BY features;
但是,我得到的不是我所期望的,而是每个现有特征组合的计数:
features |count
------------------------------------------------+--------
power steering, power windows | 1 //i.e. only 1 car has
| //only these 2 features
| //(car 1 in this example)
|
------------------------------------------------+-------
power steering, power locks, satellite radio, |
power windows, sat nav, turbo | 1
------------------------------------------------+-------
power steering, power locks, satellite radio, |
power windows | 1
因此,问题是:是否有一种方法可以使用单个 MySQL 查询来获取每个单个特征的计数,如第一个表中所示?我可以通过执行一个查询来完成对于每个功能,但我确信必须有一种避免这种麻烦的方法。有人可能还建议使用不同的表来处理特征和连接,但在不严重影响项目其余部分的情况下,目前这是不可能的。提前致谢!
最佳答案
SELECT set_list.features, COUNT(cars.features) FROM
(SELECT TRIM("'" FROM SUBSTRING_INDEX(SUBSTRING_INDEX(
(SELECT TRIM(')' FROM SUBSTR(column_type, 5)) FROM information_schema.columns
WHERE table_name = 'cars' AND column_name = 'features'),
',', @r:=@r+1), ',', -1)) AS features
FROM (SELECT @r:=0) deriv1,
(SELECT ID FROM information_schema.COLLATIONS) deriv2
HAVING @r <=
(SELECT LENGTH(column_type) - LENGTH(REPLACE(column_type, ',', ''))
FROM information_schema.columns
WHERE table_name = 'cars' AND column_name = 'features')) set_list
LEFT OUTER JOIN cars
ON FIND_IN_SET(set_list.features, cars.features) > 0
GROUP BY set_list.features
改编自:
MySQL: Query for list of available options for SET
我的查询以上述帖子中的 SQL 为基础,以获取可用列值的列表。所有缩进的 SQL 都是一个查询,如果你单独执行它,你会得到列表,我从中创建一个结果集,我称之为“set_list”。我只是按原样复制了那个查询,但它基本上做了很多字符串操作来获取列表——正如 Mike Brant 所建议的那样,如果将列表放入另一个表中,代码会简单得多(但可能不那么动态) ,并刚刚加入。
然后我将 set_list 连接回汽车表,将 set_list 中的每个项目与汽车中包含该特征的行连接 - FIND_IN_SET()。这是一个外部联接,因此如果集合列表中的任何内容未表示,它将以零计数出现。
关于php - 如何计算MySQL中的唯一设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28620904/