Количество элементов набора в столбце типа 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