sql >> Database >  >> RDS >> Mysql

Hoe maak je meerdere LEFT JOINs met OR volledig gebruik van een samengestelde index?

Van uw zoekopdracht (leesbaarheid geformatteerd)

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)

Laten we, afgezien van uw beperkende inhoud, eens kijken hoe u de gegevens van dezelfde dag probeert te vergelijken met + 1, +2 en +3. Laten we er voor dit voorbeeld ook van uitgaan dat u slechts 10 dagen in de tabel heeft, weergegeven als alle 1 juni - 10 juni 2016 in zowel uw Tabel1 EN Tabel2 tabellen.

Nogmaals, dit is een aanname dat elke tabel alle 10 datums in kwestie heeft, alleen voor simplistische doeleinden van waarom zoveel records. Dus voor tabel 1 datum van 1 juni 2016, zal het kwalificeren met tabel 2 (tb21 versie) en TWEE records retourneren. Een voor 1 juni en een andere voor 2 juni. Dus nu heb je TWEE records in je resultaat. Nu doe je dat weer left-join naar tabel 2 (tb22 versie). Dit keer zoek je 2 en 3 dagen uit, waarvan je 3 en 4 juni in de tabel hebt staan. Je krijgt dus een cartesiaans resultaat. Dus voor het record van 1 juni in tabel 1 heb je nu als volgt 4 records.

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

Laten we nu zeggen dat uw tafel 2 3 vermeldingen heeft op 2 juni en 3 vermeldingen op 3 juni en dat uw gegevens enorm zullen opzwellen. Daarom moet je meer uitleg geven over wat je probeert te doen.

Dus, als je geen echte context hebt over wat je zoekt, negeer het feit dat het je index niet perfect gebruikt. U heeft een OK op basis van de datum via de dagvergelijkingen. Het zou hoe dan ook nog steeds moeten worden gebruikt voor de query.




  1. MySql-fout:kan de tabel in de opgeslagen functie/trigger niet bijwerken omdat deze al wordt gebruikt door een instructie die deze opgeslagen functie/trigger heeft aangeroepen

  2. Hoe geef je aan dat een kolom niet nullable is bij het maken van een gerealiseerde weergave?

  3. SQL-bestand importeren met phpmyadmin in EasyPHP

  4. GO gebruiken binnen een transactie