2

我有一个像这样的表声明

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 和人口计数(也称为汉明权重)。

在我的例子中

SELECT id, POPCOUNT(bars)
FROM my_foos

会回来

1, 2
2, 1
3, 3

我必须做什么才能获得人口数量?

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

4

2 回答 2

5

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

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

于 2013-06-01T17:18:15.703 回答
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
于 2013-06-01T00:49:38.130 回答