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/