php - 如何计算MySQL中的唯一设置值

标签 php mysql mysqli

如果您能帮助我计算 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/

相关文章:

php - 什么是 . (点)在 PHP 中做什么?

php - 运行相同查询时 MySQLi 结果集变化

php - 根据用户从数组输入更新数据库

mysql - SQL:SELECT,其中不同表中的 2 列相同

PHP/MYSQLI 简单搜索不起作用

php - 如何使用 PHP/MySQLi 将 NULL 放入 MySQL 整数列中?

php - 数据库 Controller -php中的连接错误

php - 将 OctoberCMS 中的用户列表导出到 CSV

php - SQL从两个表中获取值

php - 在PHP页面上显示mysql数据库中最后添加的用户