从数据库中选择三个序列

Selecting from database with a sequence of three

我想将我 table 中的 ID 分成三组,并且每天将 select 分组到该组中的一个,并每 4 天重复一次循环。我不知道我的解释是否正确,但我会尝试举个例子。假设我们有 ids 1,2,3,4,5,6,7,8,9,10...n 第一天我要select,第二天2,5,8,11...n,第三天3,6,9,12...n。当我对奇数和偶数 id 做几乎相同的事情时,这非常容易。在奇数天我 selecting 奇数 id 和偶数天偶数 ids。但现在我需要在 3 天的时间内完成。提前谢谢你。

SELECT * FROM TABLE
WHERE
id%3 = 1 -- for day 1
id%3 = 2 -- for day 2
id%3 = 0 -- for day 3

或者您可以使用:

SELECT * FROM TABLE
WHERE CASE WHEN id % 3 = 0 THEN 3
                   ELSE id % 3
              END = YourDayNumber

样本:

SELECT id,
'Day ' + CAST(CASE WHEN id % 3 = 0 THEN 3
                   ELSE id % 3
              END AS VARCHAR(100)) DayNbr
FROM 
(
SELECT 1 id
UNION
SELECT 2
UNION
SELECT 3
UNION
SELECT 4
UNION
SELECT 5
UNION
SELECT 6
UNION
SELECT 7
UNION
SELECT 8
UNION
SELECT 9
) a

使用 MOD(x,y) 函数 returns x 除以 y 的余数和函数 TO_DAYS(some_date_here) returns 自 0 年以来的天数。通过在 TO_DAYS 中使用函数 NOW() 我们每天都会得到一个新数字。也把它放在模数中,这将每 3 天生成一个周期,它将 select ids like

1,4,7,10...

第二天

2,5,8,11...

第二天

3,6,9,12

第二天再次从顶部返回

所以这个查询每天都无需修改就可以工作:

SELECT * FROM my_table WHERE MOD(my_id,3)=MOD(TO_DAYS(NOW()),3)

此分组可以轻松更改,只需将“3”更改为您想要的任何内容(请注意,您需要更改 BOTH MOD() 中的“3”小号)

    SELECT * FROM ints;
    +---+
    | i |
    +---+
    | 0 |
    | 1 |
    | 2 |
    | 3 |
    | 4 |
    | 5 |
    | 6 |
    | 7 |
    | 8 |
    | 9 |
    +---+

    SELECT * FROM ints WHERE MOD(i,3) = MOD(DATEDIFF(CURDATE(),'2015-03-20'),3);
    +---+
    | i |
    +---+
    | 1 |
    | 4 |
    | 7 |
    +---+

    SELECT * FROM ints WHERE MOD(i,3) = MOD(DATEDIFF(CURDATE(),'2015-03-21'),3);
    +---+
    | i |
    +---+
    | 0 |
    | 3 |
    | 6 |
    | 9 |
    +---+

    SELECT * FROM ints WHERE MOD(i,3) = MOD(DATEDIFF(CURDATE(),'2015-03-22'),3);
    +---+
    | i |
    +---+
    | 2 |
    | 5 |
    | 8 |
    +---+

    SELECT * FROM ints WHERE MOD(i,3) = MOD(DATEDIFF(CURDATE(),'2015-03-23'),3);
    +---+
    | i |
    +---+
    | 1 |
    | 4 |
    | 7 |
    +---+

Obviously, add 1 to the calculation if necessary.