正如@PRPGFerret 建议的那样,您确实应该规范化您的架构(请参阅@BillKarwin 对“在数据库列中存储逗号分隔列表真的那么糟糕吗? ”的回答):
CREATE TABLE Hours (Hour TINYINT UNSIGNED NOT NULL);
INSERT INTO Hours (Hour) VALUES
( 0),( 1),( 2),( 3),( 4),( 5),( 6),( 7),( 8),( 9),(10),(11),
(12),(13),(14),(15),(16),(17),(18),(19),(20),(21),(22),(23)
;
CREATE TABLE HoursAvailable (
Day ENUM(
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday',
'Sunday'
) NOT NULL,
ID BIGINT UNSIGNED NOT NULL,
Hour TINYINT UNSIGNED NOT NULL,
PRIMARY KEY (Hour, Day, ID)
);
INSERT INTO HoursAvailable (Day, ID, Hour)
SELECT 'Monday', ID, Hour
FROM my_table JOIN Hours ON FIND_IN_SET(Hours.Hour, my_table.monday)
UNION ALL
SELECT 'Tuesday', ID, Hour
FROM my_table JOIN Hours ON FIND_IN_SET(Hours.Hour, my_table.tuesday)
;
DROP TABLE Hours;
DROP TABLE my_table;
然后你可以这样做:
SELECT Day, COUNT(*) FROM HoursAvailable WHERE Hour = 3 GROUP BY Day;
在sqlfiddle上查看。
如果不以这种方式规范化您的数据,您可能会做一些相当低效的事情:
SELECT SUM(FIND_IN_SET(3, monday )>0),
SUM(FIND_IN_SET(3, tuesday)>0)
FROM my_table;
在sqlfiddle上查看。
请注意,正如@ArielChelsău 所观察到的,星期二的计数1
不是0
问题中提到的。