【问题标题】:MySQL: select random individual from available to populate new tableMySQL:从可用中选择随机个体以填充新表
【发布时间】:2018-01-22 13:24:12
【问题描述】:

我正在尝试根据休假日期和工作偏好自动生成名册。我已经生成了一些要使用的数据,现在我有两张表 - 一张包含个人列表以及他们在一周中特定日期工作的偏好(例如,有些人喜欢在星期二工作,其他人只在每隔一个星期三工作,等等) ,另一个带有个人休假日期。看起来像这样,其中firstprefsecondpref 代表周一 = 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 表,其中包含一个标记(12),在其中的一个列中显示它是花名册模式的哪一周。

我已经运行了这个查询:

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的表格?

【问题讨论】:

    标签: mysql select random


    【解决方案1】:

    所以我想出了如何去做。 第一个选择(上面概述)形成了名为 ROWPERROW()PROCEDURE 的核心,并生成了一个名为 available_people 的表

    这可能是肮脏的 MySQL 代码,但它可以工作:

    SET @tdate = 0
    DROP TABLE IF EXISTS on_call;
    CREATE TABLE working(tdate DATE, whatDay VARCHAR(20), selected VARCHAR(255));
    DELIMITER //
    
    DROP PROCEDURE IF EXISTS ROWPERROW2;
    CREATE PROCEDURE ROWPERROW2()
    BEGIN
    DECLARE n INT DEFAULT 0;
    DECLARE kk INT DEFAULT 0;
    SET n=90; -- or however many days the roster is going to run for
    SET kk=0;
    WHILE kk<n DO
    SET @tdate = (SELECT c_dates.fulldate from clwdates AS c_dates LIMIT kk,1); 
    INSERT INTO working
    SELECT @tdate, DATE_FORMAT(@tdate,'%W') AS whatDay, t1.available 
    FROM available_people AS t1 -- this is the table created by the first query above
    WHERE tdate = @tdate ORDER BY RAND() LIMIT 1;
    
    SET kk = kk + 1;
    END WHILE;
    end;
    //
    
    DELIMITER ;
    
    CALL ROWPERROW2();
    
    SELECT * from working; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多