【发布时间】:2012-07-10 14:49:10
【问题描述】:
我没想到会这么难,但我试图在 MySQL 中设置一个用户变量来包含一个值数组。我不知道如何做到这一点,所以尝试做一些研究,但很惊讶没有找到答案。我试过了:
SET @billable_types = ['client1','client2','client3'];
原因是我想稍后在以下语句中使用该变量:
SELECT sum((time_to_sec(timediff(tlg.time_stop, tlg.time_start))/3600)) as billable_hours
from mod_tmlog_time_log tlg, mod_tmlog_task_list mttl
where date(tlg.time_start) >= @time_start
and date(tlg.time_stop) <= @time_stop
and mttl.type IN (@billable_types)
and tlg.task_id = mttl.id
group by start_date
order by start_date desc;
非常感谢您的帮助。
快进一会儿,我最终得到了以下快速而肮脏的解决方案花更多的时间在上面。
SELECT WEEKDAY(tlg.time_start) AS day_of_week, date(tlg.time_start) as start_date,
sum((time_to_sec(timediff(tlg.time_stop, tlg.time_start))/3600)) as billable_hours
from mod_tmlog_time_log tlg, mod_tmlog_task_list mttl
where date(tlg.time_start) >= @time_start
and date(tlg.time_stop) <= @time_stop
and mttl.type IN ('c1','c2','c3')
and tlg.task_id = mttl.id
group by start_date
order by start_date desc;
joostschouten 似乎找到了最优雅的解决方案(我自己还没有测试过),但下次我写需要这个的东西时,我会记得测试它!
【问题讨论】:
-
SQL 中没有数组这样的东西——只有集合。不幸的是,您尝试做的不起作用-mysql会将@billtable_types 替换为您的“数组”的内容作为单个整体字符串,而不是将其视为一堆单独的逗号分隔值。尝试使用
FIND_IN_SET()函数而不是IN运算符。