sql >> Databasteknik >  >> RDS >> Mysql

Hur gör man flera LEFT JOINs med ELLER använder ett sammansatt index fullt ut?

Från din fråga (läsbarhetsformaterad)

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)

Bortsett från ditt restriktiva innehåll som tillhandahålls, låt oss titta på dig som försöker jämföra data från samma dag till dag + 1, +2 och +3. Låt oss också anta att du bara för det här exemplet bara har 10 dagar i tabellen representerade som alla 1 juni - 10 juni 2016 i både tabellerna Tabell1 OCH Tabell2.

Återigen, detta är ett antagande att varje tabell har alla 10 datum i fråga bara för förenklade syften om varför så många poster. Så för tabell 1-datumet den 1 juni 2016 kommer den att kvalificera sig med tabell 2 (tb21-version) och returnera TVÅ poster. En för 1 juni och en annan för 2 juni. Så nu har du TVÅ rekord i ditt resultat. Nu gör du det igen och vänster-anslut till tabell 2 (tb22 version). Den här gången letar du efter 2 och 3 dagar ut, varav du har 3 och 4 juni i tabellen. Så du får ett kartesiskt resultat. Så för 1 juni-posten i tabell 1 har du nu 4 poster enligt följande.

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

Låt oss nu säga att din tabell 2 har 3 poster den 2 juni och 3 poster den 3 juni och din data kommer att bli supersvälld. Det är därför du behöver ge mer förtydligande om vad du försöker göra.

Så, utan att ha ett riktigt sammanhang på vad du letar efter, ignorera det faktum att det inte använder ditt index perfekt. Du har ett ELLER baserat på datumet via dagsjämförelserna. Det bör fortfarande användas för frågan i alla fall.




  1. Använder BLOB i where-sats i MySQL

  2. ändra mysql datetime till php datetime-local fungerar inte av strtotime()

  3. Infinite Scroll Laddar alla objekt på en gång?

  4. Sammanfoga poster i en enda kolumn utan looping?