使用mysql函数作为列名

时间:2015-07-14 13:14:03

标签: mysql

列名是动态的,就像今天它是14所以列名是14,值是A.返回行。

但它没有给出任何结果。

SELECT * FROM student_attendance WHERE CONCAT('\'',DAYOFMONTH(CURRENT_DATE()) ,'\'') LIKE '%A%'

这实际上就像

SELECT * FROM student_attendance WHERE `14` = 'A'

2 个答案:

答案 0 :(得分:0)

字符串操作函数将返回字符串,而不是对模式对象的引用。

如果您绝对必须拥有"动态"列名,那么你可能需要动态地将查询构建为字符串并执行它。可能using EXECUTE带有一个字符串作为查询语句。类似的东西:

PREPARE query FROM 'SELECT something FROM sometable WHERE ' + CONCAT('\'',DAYOFMONTH(CURRENT_DATE()) ,'\'') + ' LIKE somevalue';
EXECUTE query;

要让它正常工作可能需要一些修补,我不能在我面前有一个我可以测试的例子。

然而 ,您 更好定义更静态的架构,以便您可以轻松查询数据。如果您的架构是动态并且更改的频率高于代码本身的更改,那么您基本上错误地使用关系数据库。

答案 1 :(得分:0)

从我所看到的情况来看,这应该是可能的,但经过几次尝试后,我仍然无法查询是否有效。

但是,我建议不要使用此模式,因为它只会导致问题。

不是每月的每一天都有一个专栏,最好将其抽象为以下内容:

id | day | month | year |       created_at    | student_id | status
 1 |  14 |   07  | 2015 | 2015-07-14 09:00:00 |          1 |      A

然后,您还可以获得向daymonthyearstudent_id列添加索引的好处。

即使您使当前查询有效,使用CONCATDAYOFMONTHCURRENT_DATELIKE等功能也意味着您执行的每个查询都涉及全表扫描当你的桌子大小增加时,你的查询最终需要很长时间才能完成,而使用上面的结构你可以做到:

SELECT *
FROM student_attendance
WHERE `day` = 14 AND `month` = 7 AND `year` = 2015 AND `status` = 'A'

SELECT *
FROM student_attendance
WHERE `created_at` BETWEEN '2015-07-14 00:00:00' AND '2015-07-14 11:59:59'
AND `status` = 'A'

虽然,最好不要使用daymonthyear作为列名,因为它们是保留字,但它们仅作为示例。

这也假设你是通过一些服务器端语言运行查询(填充日期变量),这可能不是这种情况,如果没有,你总是会使用MYSQL函数,如前所述,将导致大数据集的查询速度慢。