sql >> Databáze >  >> RDS >> Mysql

Jak vytvořit více LEFT JOINů s NEBO plně používat složený index?

Z vašeho dotazu (ve formátu čitelnosti)

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)

Kromě vašeho omezujícího obsahu, který jste poskytli, se podívejme na vás, když se pokoušíte porovnat data ze stejného dne na den + 1, +2 a +3. Předpokládejme také, že pouze pro tento příklad máte v tabulce pouze 10 dní reprezentovaných jako celý 1. červen až 10. červen 2016 v obou tabulkách Table1 A Table2.

Opět se jedná o předpoklad, že každá tabulka má všech 10 příslušných dat, jen pro zjednodušení, proč tolik záznamů. Takže pro tabulku 1 datum 1. června 2016 se bude kvalifikovat s tabulkou 2 (verze tb21) a vrátí DVA záznamy. Jeden na 1. června a druhý na 2. června. Takže teď máte ve svém výsledku DVA záznamy. Nyní to udělejte znovu levým připojením k tabulce 2 (verze tb22). Tentokrát hledáte 2 a 3 dny venku, z toho máte v tabulce 3. a 4. června. Získáváte tedy kartézský výsledek. Takže pro záznam 1. června v tabulce 1 máte nyní 4 následující záznamy.

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

Nyní řekněme, že váš stůl 2 má 3 položky 2. června a 3 položky 3. června a vaše data budou super nafouknutá. To je důvod, proč potřebujete více objasnit, co se snažíte udělat.

Pokud tedy nemáte skutečný kontext toho, co hledáte, ignorujte skutečnost, že váš index dokonale nevyužívá. Máte OR založený na datu prostřednictvím porovnání dnů. I tak by se měl pro dotaz používat.




  1. Vzdálené připojení PostgreSQL s pgAdmin

  2. Proměnná MySQL wait_timeout - GLOBAL vs. SESSION

  3. Efektivita čtvrtletního výpočtu počtu zaměstnanců

  4. Jak ukládat různé typy dokumentů