Tag Archive repeate

MySql: for loop

บางครั้งก็อยากจะให้ MySql มันวน loop ทำอะไรซักอย่าง เช่น นายกจะเปิดประเทศใน 120 วันในวันที่ 16 มิถุนายน 2564 ก็อยากจะพร๊อตกราฟดูเล่น ๆ ที่นี้อยากจะได้วันที่ทั้ง 120 วันแบบไม่ถึก

  • ใช้ตารางที่มีข้อมูลมากกว่า 120 เรคคอร์ดมาช่วย สมมุติว่ามี table ที่ชื่อว่า some_large_table
SET
    @i = -1;
SELECT
    @i,
    DATE(
        ADDDATE(
            '2021-06-16',
            INTERVAL @i := @i +1 DAY
        )
    ) AS DATE
FROM
    some_large_table
WHERE
    @i < 120

ข้อเสียวิธีนี้คือ จะต้องมีตารางที่มีแรคคอร์ดมากกว่าจำนวนที่เราต้องการจะวน ถ้าเราต้องการมากกว่านี้ เช่น ชีวิตของเรามีแค่ 20,000 วันตามพี่แสตมป์ ก็มีตารางไม่กี่ตารางที่จะมีข้อมูลขนาดนั้น

  • ใช้ RECURSIVE CTE
SET @@cte_max_recursion_depth = 20000;
WITH RECURSIVE cte AS(
    SELECT
        1 AS i
    UNION ALL
SELECT
    i +1
FROM
    cte
WHERE
    i < 20000
)
SELECT
    i,
    DATE(
        ADDDATE('2021-06-16', INTERVAL i DAY)
    ) AS DATE
FROM
    cte

วิธีนี้ถึงจะซับซ้อนกว่าเยอะ แต่ช่วยให้สามารถทำข้อมูลขนาดใหญ่ ขึ้นได้จริง ๆ

Cr: Creating a “Numbers Table” in MySQL