mysql数据库中有一个用户配置文件表,其中一个字段是跟踪用户组的SET列。
表格结构为:

CREATE TABLE IF NOT EXISTS `users_profiles` (
  `userId` mediumint(9) NOT NULL DEFAULT '0',
  `birthday` date DEFAULT NULL,
  `groups` set('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20')
 );

我想在一个排序的降序列表中找到最受欢迎的组,但是我们使用SET列这一事实使得使用COUNT等函数有点困难。
我可以通过运行以下查询获取特定的组计数:
SELECT count(NULLIF(`interests` & 1,0)) as Count1stVal FROM users_profiles;

但是,我不想为每个组运行查询,然后计算最受欢迎的组

最佳答案

我有一个建议,但不是实际的代码(因为我不太熟悉set数据类型)。
首先,创建一个临时表或子查询,该表或子查询对集合的每个元素都有一行。每一行的集合中都会有这个元素。称之为这些元素。
其次,执行以下查询:

select e.element, count(*)
from user_profiles up join
     Elements e
     on up.groups like concat('%', e.element, '%')
group by e.element
order by 2 desc

现在,唯一的问题是设置的值彼此重叠。所以,你有“1”和“10”,所以这不太管用。您可以执行以下操作之一来修复此问题。
重命名设置值(例如,实际的表可能没有此问题)。
使用“&”操作和生成的数字列表。在这种情况下,on语句更改为:
打开up.groups&e.element>0
页面http://www.vbmysql.com/articles/mysql/the-mysql-set-datatype很好地概述了使用集合可以做什么。这也解释了为什么他们经常气馁。. . 因为它们不提供规范化表的功能。

关于php - SQL查询,用于从SET列中获取最常用的项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11251295/

10-09 08:23
查看更多