Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak sprawić, by wiele LEFT JOIN z OR w pełni wykorzystywało indeks złożony?

Z zapytania (format czytelności)

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)

Oprócz Twoich restrykcyjnych treści, przyjrzyjmy się, jak próbujesz porównać dane z tego samego dnia na dzień + 1, +2 i +3. Załóżmy również, że tylko dla tego przykładu masz tylko 10 dni w tabeli reprezentowanej jako wszystkie od 1 czerwca do 10 czerwca 2016 r. zarówno w tabelach Tabela 1, jak i Tabela 2.

Ponownie, jest to założenie, że każda tabela zawiera wszystkie 10 dat, o których mowa, tylko w celu uproszczenia, dlaczego tak wiele rekordów. Tak więc dla tabeli 1 z dnia 1 czerwca 2016 r. zakwalifikuje się ona z tabelą 2 (wersja tb21) i zwróci DWA rekordy. Jeden na 1 czerwca, a drugi na 2 czerwca. Więc teraz masz w swoim wyniku DWA rekordy. Teraz robisz to ponownie, dołączając do tabeli 2 (wersja tb22). Tym razem szukasz 2 i 3 dni wolnego, z czego w tabeli masz 3 i 4 czerwca. Więc otrzymujesz wynik kartezjański. Tak więc dla rekordu 1 czerwca w tabeli 1 masz teraz 4 rekordy w następujący sposób.

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

Teraz powiedzmy, że Twój stół 2 ma 3 wpisy 2 czerwca i 3 wpisy 3 czerwca, a Twoje dane będą się bardzo powiększać. Dlatego musisz podać więcej wyjaśnień na temat tego, co próbujesz zrobić.

Tak więc, nie mając prawdziwego kontekstu tego, czego szukasz, zignoruj ​​fakt, że nie wykorzystuje on idealnie Twojego indeksu. Masz OR na podstawie daty za pomocą porównań dziennych. W każdym razie powinien być wykorzystany w zapytaniu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przyznaj MySQL uprawnienia do tabel i kolumn

  2. Zwróć dzień, miesiąc i rok w MySQL

  3. Wstaw rekordy do bazy danych mysql za pomocą php za pomocą Ajax

  4. mysql nie jest rozpoznawany jako polecenie wewnętrzne lub zewnętrzne, działający program lub wsad

  5. mysql tworzy użytkownika tylko wtedy, gdy użytkownik nie istnieje