SET类型(人口数)列中的设置元素数

时间:2013-06-01 00:33:49

标签: mysql sql hammingweight

我有像

这样的表格声明
CREATE TABLE my_foos (
    id INT NOT NULL AUTO_INCREMENT,
    bars SET('one', 'two', 'three', 'four', 'five') NOT NULL
)

1, ('one', 'two')
2, ('two')
3, ('three', 'four', 'five')

现在我想选择id和population count(也称为汉明重量)的条形码。

在我的例子中

SELECT id, POPCOUNT(bars)
FROM my_foos

将返回

1, 2
2, 1
3, 3

我需要做些什么来计算人口?

请不要在客户端回答如何执行此操作。我希望该解决方案也可以在WHERE,ORDER BY,HAVING等中使用。

2 个答案:

答案 0 :(得分:4)

BIT_COUNT(bars)返回SET中的一位数。

我不知道/期望您可以像使用整数一样使用SET数据类型。

答案 1 :(得分:2)

我认为有很多方法可以解决这个问题,但我使用的方法就是这个,

CHAR_LENGTH(bars) - CHAR_LENGTH(REPLACE(bars, ',', '')) + 1

如果你愿意,你可以将其作为Function

DELIMITER $$
CREATE FUNCTION POPCOUNT(popList SET('one', 'two', 'three', 'four', 'five'))
RETURNS INT 
BEGIN
    RETURN CHAR_LENGTH(popList) - CHAR_LENGTH(REPLACE(popList, ',', '')) + 1;
END $$
DELIMITER ;

你可以称之为,

SELECT POPCOUNT(bars) FROM my_foos