Количество элементов набора в столбце типа SET (количество населения)

У меня есть объявление таблицы как

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 и т. Д.

2 ответа

Решение

BIT_COUNT(bars) возвращает количество битов в SET.

Я не знал / не ожидал, что вы можете просто использовать тип данных SET как целое число.

Я думаю, что есть много способов решить эту конкретную проблему, но подход, который я использую, заключается в следующем,

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
Другие вопросы по тегам