sql >> Database >  >> RDS >> Mysql

bereik geheugenlimiet met lus binnen lus binnen lus

Ik zou een reeks dagen genereren en meedoen met je seizoenstabel, en een enkele zoekopdracht gebruiken om de gewenste resultatenset te krijgen, bijvoorbeeld:

SELECT dates.Date,
       coalesce(s.price, 0) AS price
FROM
  (SELECT a.Date
   FROM
     ( SELECT curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY AS Date, '0' AS price
      FROM
        (SELECT 0 AS a
         UNION ALL SELECT 1
         UNION ALL SELECT 2
         UNION ALL SELECT 3
         UNION ALL SELECT 4
         UNION ALL SELECT 5
         UNION ALL SELECT 6
         UNION ALL SELECT 7
         UNION ALL SELECT 8
         UNION ALL SELECT 9) AS a
      CROSS JOIN
        (SELECT 0 AS a
         UNION ALL SELECT 1
         UNION ALL SELECT 2
         UNION ALL SELECT 3
         UNION ALL SELECT 4
         UNION ALL SELECT 5
         UNION ALL SELECT 6
         UNION ALL SELECT 7
         UNION ALL SELECT 8
         UNION ALL SELECT 9) AS b
      CROSS JOIN
        (SELECT 0 AS a
         UNION ALL SELECT 1
         UNION ALL SELECT 2
         UNION ALL SELECT 3
         UNION ALL SELECT 4
         UNION ALL SELECT 5
         UNION ALL SELECT 6
         UNION ALL SELECT 7
         UNION ALL SELECT 8
         UNION ALL SELECT 9) AS c) a
   WHERE a.Date BETWEEN '$from' AND '$to'
   ORDER BY a.Date) dates
LEFT JOIN seasons s ON dates.Date BETWEEN s.start AND s.END

De gecompliceerde innerlijke query vermijdt het maken van een tijdelijke tabel (overgenomen van genereren dagen vanaf datumbereik ) en werkt tot 1000 dagen, maar het maken van een tijdelijke tabel zou prima zijn.



  1. Oracle rownum-gedrag met mod-functie

  2. hoe selecteer ik de meest voorkomende waarden?

  3. DATETIME VS INT voor het opslaan van tijd?

  4. Tel het aantal NULL's op een rij