Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да направите множество LEFT JOIN с OR напълно да използвате съставен индекс?

От вашата заявка (форматирана за четливост)

SELECT 
      table1.*, 
      tb21.year, 
      tb21.month, 
      tb21.day, 
      tb22.year, 
      tb22.month, 
      tb22.day 
   FROM 
      table1
         LEFT JOIN table2 tb21 
            ON table1.year = tb21.year
            AND table1.month = tb21.month
            AND (tb21.day = table1.day 
              OR tb21.day = table1.day+1)
         LEFT JOIN table2 tb22 
            ON table1.year = tb22.year
            AND table1.month = tb22.month
            AND (tb22.day = table1.day+2 
              OR tb22.day = table1.day+3)

Освен предоставеното от вас ограничаващо съдържание, нека ви разгледаме как се опитвате да сравните данните от един и същи ден на ден + 1, +2 и +3. Нека също така приемем само за този пример, че имате само 10 дни в таблицата, представени като всички 1 юни – 10 юни 2016 г. и в двете таблици Table1 И Table2.

Отново, това е предположение, че всяка таблица има всичките 10 въпросни дати само за опростени цели защо толкова много записи. И така, за дата на таблица 1 от 1 юни 2016 г., тя ще отговаря на изискванията на таблица 2 (версия tb21) и ще върне ДВА записа. Един за 1 юни и друг за 2 юни. Така че сега имате ДВА записа в резултата си. Сега правите това отново - присъединете се отляво към таблица 2 (версия tb22). Този път търсите 2 и 3 дни навън, от които имате 3 и 4 юни в таблицата. Така че получавате декартов резултат. И така, за записа от 1 юни в таблица 1 вече имате 4 записа, както следва.

T1Year  T1Month  T1Day  T21Day T22Day
2016    6        1      1      3
2016    6        1      1      4
2016    6        1      2      3
2016    6        1      2      4

Сега, да кажем, че вашата таблица 2 има 3 записа на 2 юни и 3 записа на 3 юни и вашите данни ще се раздуят супер. Ето защо трябва да предоставите повече разяснения за това, което се опитвате да направите.

Така че, ако нямате истински контекст за това, което търсите, игнорирайте факта, че не използва идеално вашия индекс. Имате ИЛИ въз основа на датата чрез сравненията на дните. Така или иначе трябва да се използва за заявката.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да намерите най-често срещаните думи в MySQL база данни и да осредните втора колона

  2. Някои проблеми със Sphinx и PHP

  3. Номер на ред за резултати от заявка, групирани по колона

  4. Най-бързият начин за повторение през голяма таблица с помощта на JDBC

  5. Защо не мога да вмъкна в MySQL?