Mysql 复杂选择解释

Mysql 复杂选择解释,mysql,sql,Mysql,Sql,作为解决我问题的后续行动,我发回了,因为,老实说,我并不完全理解这一点 如果有人能告诉我关于数据计算的事,为什么要把它分成一个b c和交叉连接部分,我会非常感激 这个答案在我的代码中实现了非常高的性能升级,所以我认为在这里解释这个方法对每个人都是有用的 干杯 SELECT dates.Date, coalesce(s.daily_price, 0) AS price, s.id_item AS house FROM (SELECT a.Date FROM ( S

作为解决我问题的后续行动,我发回了,因为,老实说,我并不完全理解这一点

如果有人能告诉我关于数据计算的事,为什么要把它分成一个b c和交叉连接部分,我会非常感激

这个答案在我的代码中实现了非常高的性能升级,所以我认为在这里解释这个方法对每个人都是有用的

干杯

SELECT dates.Date,
       coalesce(s.daily_price, 0) AS price, s.id_item AS house
FROM
  (SELECT a.Date
   FROM
     ( SELECT '$to' - 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 ".T_ITEM_SEASONS." s ON dates.Date BETWEEN s.season_start AND s.season_end
编辑:在我原来的问题中,我添加了一个bug,下面将讨论这个bug。错误代码是: 300*c.a英寸
选择“$to”-间隔a.a+10*b.a+300*c.a.a.a.a.a.a.a.a.a.c.a.a.a.a.c.a.a.a.c.a.a.a.a.a.a.a.a.a.a.c.a.a.a.a.a.a.a

{0, 1,2,..., 9} x {0, 1,2,..., 9} x {0, 1,2,..., 9}
a                 b                 c
让我们把这部分命名为x

( SELECT curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY AS Date
基本上选择当前日期,并从中减去N天,表示N=0,1,2,…,999 使用笛卡尔乘积中生成的a、b和c值。请注意,每个
N每个数字都不确定为什么更改此零件间隔a.a+10*b.a+300*c.a。在原始答案中不是这样。@peter.petrov,我更改是因为我需要追溯到5年前的日期。我的直觉告诉我,你这样引入了一个bug,因为这个公式似乎跳过了一些日期。您应该使用3个交叉联接,然后在a、b、c的顶部添加d。5年大约有1825天,所以在你的d中你需要有0,1的值。最初的答案可以追溯到999天以前。你应该用这个:a.a+10*b.a+100*c.a+1000*d.a其中d取集合{0,1}.@peter.petrov中的值,老实说,这就是这篇文章的原因,我不确定。所以我在这里试了试,看起来很好:看起来很好,很好。哪一个a、b、c会给出从今天算起1400天的日期?答:没有。所以你跳过了这个日期,而不仅仅是这个。一些数论清楚地表明了这一点:有趣!我将添加d以达到更多的天数,而不是我的四轮马车方式。谢谢看到你的编辑了。因为我不理解代码,所以我不理解它的逻辑。我现在明白了,明白我的意思了。谢谢@Rikard从100天到299天你都有空档。从1300天到1499天,你也有差距。也许还有其他的差距。只要写3个嵌套的循环,就像我看到更新的答案一样,你们会被说服的。谢谢你们花时间来帮助我!干杯
     (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 997
     UNION ALL SELECT 998
     UNION ALL SELECT 999) AS a
( SELECT curdate() - INTERVAL (a.a) DAY AS Date
    import java.util.TreeMap;

    public class Test050 {

        public static void main(String[] args) {
            TreeMap<Integer, Boolean> v = new TreeMap<Integer, Boolean>();
            for (int a=0; a<10; a++){
                for (int b=0; b<10; b++){
                    for (int c=0; c<10; c++){
                        int r = a + 10 * b + 300 * c;
                        v.put(r, Boolean.TRUE);
                    }
                }
            }

            for (int key : v.keySet()){
                System.out.println(key);
            }
        }

    }