【发布时间】:2018-01-22 13:24:12
【问题描述】:
我正在尝试根据休假日期和工作偏好自动生成名册。我已经生成了一些要使用的数据,现在我有两张表 - 一张包含个人列表以及他们在一周中特定日期工作的偏好(例如,有些人喜欢在星期二工作,其他人只在每隔一个星期三工作,等等) ,另一个带有个人休假日期。看起来像这样,其中firstpref 和 secondpref 代表周一 = 1、周日 = 7 的工作日,firstprefclw 表示某人更喜欢 2 周模式中的哪一周的标记(0 = 无首选项,1 = 周 1首选,2 = wk2 首选)
initials | firstpref | firstprefclw | secondpref | secondprefclw
KP | 3 | 0 | 1 | 0
BD | 2 | 1 | 1 | 0
LW | 3 | 0 | 4 | 1
然后有一个表leave_entries,它基本上有每个请假请求的首字母、开始日期和结束日期。
最后,有一个预先计算的 clwdates 表,其中包含一个标记(1 或 2),在其中的一个列中显示它是花名册模式的哪一周。
我已经运行了这个查询:
SELECT @tdate, DATE_FORMAT(@tdate,'%W') AS whatDay, GROUP_CONCAT(t1.initials separator ',') AS available
FROM people AS t1
WHERE ((t1.firstpref = (DAYOFWEEK(@tdate))-1
AND (t1.firstprefclw = 0 OR (t1.firstprefclw = (SELECT c_dates.clw from clwdates AS c_dates LIMIT i,1))))
OR (t1.secondpref = (DAYOFWEEK(@tdate))-1
AND (t1.secondprefclw = 0 OR (t1.secondprefclw = (SELECT c_dates.clw from clwdates AS c_dates LIMIT i,1)))
OR ((DAYOFWEEK(@tdate))-1 IN (0,5,6))
AND t1.initials NOT IN (SELECT initials FROM leave_entries WHERE @tdate BETWEEN leave_entries.start_date and leave_entries.end_date)
);
我的输出是带有模式首字母的日期列表:
2018-01-03;Wednesday;KP,LW,TH
我想要的输出是
2018-01-03;Wednesday;KP
此人的姓名首字母是从第一组SELECTs 生成的可用人员列表中随机选择的。
我看到了一个 SO 帖子,其中提出了如何执行此操作的建议,涉及 SUBSTRING_INDEX (How to select Random Sub string,which seperated by coma(",") From a string),但是我注意到 CSV 不是可行的方法,因为我有一张桌子这不是 CSV,我想知道:
如何从可用的姓名中随机选择一个人的姓名首字母并创建一个基本上是date ; random_person的表格?
【问题讨论】: