sql >> Database teknologi >  >> RDS >> Mysql

Hvordan laver man flere LEFT JOINs med ELLER bruger fuldt ud et sammensat indeks?

Fra din forespørgsel (læsbarhedsformateret)

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)

Bortset fra dit begrænsede indhold, lad os se på dig, der prøver at sammenligne data fra samme dag til dag + 1, +2 og +3. Lad os også antage, at du kun for dette eksempel kun har 10 dage i tabellen repræsenteret som alle 1. juni - 10. juni 2016 i både dine Tabel1- OG Tabel2-tabeller.

Igen er dette en antagelse om, at hver tabel har alle 10 pågældende datoer, bare for forenklede formål med, hvorfor så mange poster. Så for Tabel 1-datoen 1. juni 2016 vil den kvalificere sig med tabel 2 (tb21-version) og returnere TO poster. En for 1. juni og en anden for 2. juni. Så nu har du TO rekorder i dit resultat. Nu gør du det igen, venstre-join til tabel 2 (tb22 version). Denne gang leder du efter 2 og 3 dage ude, hvoraf du har 3. og 4. juni i tabellen. Så du får et kartesisk resultat. Så for 1. juni-posten i tabel 1 har du nu 4 poster som følger.

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

Lad os nu sige, at din tabel 2 har 3 poster den 2. juni og 3 poster den 3. juni, og dine data kommer til at svulme op. Dette er grunden til, at du er nødt til at give mere afklaring på, hvad du forsøger at gøre.

Så, uden at have en sand kontekst på det, du leder efter, ignorer det faktum, at det ikke perfekt udnytter dit indeks. Du har en OR baseret på datoen via dag-sammenligningerne. Det skal alligevel stadig bruges til forespørgslen.




  1. Installer og opret forbindelse til PostgreSQL 10 på Ubuntu 16.04

  2. SQL-kommando til at stoppe job i pgAdmin 4

  3. TOP og ORDER BY sql fejl

  4. problem med at få num_rows med PDO-klassen i php