sql >> Databasteknik >  >> Database Tools >> phpMyAdmin

Välj en post bara om den innan den har ett lägre värde tar för lång tid och misslyckas

Här är en lösning för din fråga 1 som kommer att köras mycket snabbare, eftersom du har många genomsökningar av hela tabellen och beroende underfrågor. Här har du som mest bara en tabellskanning (och kanske en tillfällig tabell, beroende på hur stor din data är och hur mycket minne du har). Jag tror att du enkelt kan anpassa det till din fråga här. Fråga 2 (jag har inte läst den riktigt) är förmodligen också besvarad eftersom det nu är enkelt att bara lägga till där date_column =whatever

välj * från ( välj t.*, if(@prev_toner  

EDIT:

Förklaring:

Med den här raden

 , (välj @prev_toner:=0, @prev_sn:=SerialNumber från Tabell1 sortera efter serienummer  

vi initierar bara variablerna @prev_toner och @prev_sn i farten. Det är samma sak som att inte ha den här raden i frågan alls utan att skriva framför frågan

SET @prev_toner =0;SET @prev_sn =(välj serienummer från din_tabellordning efter serienummergräns 1);VÄLJ ... 

Så varför gör frågan för att tilldela ett värde till @prev_sn och varför beställa efter serienummer? Ordningen efter är mycket viktig. Utan en beställning av finns det ingen garanterad ordning i vilken rader returneras. Vi kommer också åt värdet på föregående rader med variabler, så det är viktigt att samma serienummer "grupperas ihop".

Kolumnerna i select-satsen utvärderas en efter en, så det är viktigt att du först väljer den här raden

if(@prev_toner  

innan du väljer dessa två rader

@prev_sn :=Serienummer,@prev_toner :=Remain_Toner_Black

Varför är det så? De två sista raderna tilldelar bara värdena för de aktuella raderna till variablerna. Därför på denna rad

if(@prev_toner  

variablerna håller fortfarande värdena för de föregående raderna. Och vad vi gör här är inget annat än att säga "om värdet på föregående rader i kolumnen Remain_Toner_Black är mindre än värdet i den aktuella raden och föregående rads serienummer är detsamma som det faktiska radens serienummer, return 1, annars returnerar 0."

Sedan kan vi helt enkelt säga i den yttre frågan "välj varje rad, där ovanstående returnerade 1".

Med tanke på din fråga behöver du inte alla dessa underfrågor. De är väldigt dyra och onödiga. Egentligen är det ganska vansinnigt. I den här delen av frågan

 VÄLJ a.ID, a.Time, a.SerialNumber, a.Remain_Toner_Black, a.Remain_Toner_Cyan, a.Remain_Toner_Magenta, a.Remain_Toner_Yellow, ( SELECT COUNT(*) FROM Reports c WHERE c.SerialNumber =a.SerialNumber .SerialNumber AND c.ID <=a.ID) SOM RowNumber FROM rapporterar a 

du väljer hela tabellen och för varje rad du räknar raderna inom den gruppen. Det är en beroende underfråga. Allt bara för att ha något slags radnummer. Sedan gör du detta en andra gång, bara så att du kan gå med i dessa två tillfälliga tabeller för att få den föregående raden. Det är verkligen inte konstigt att prestationen är hemsk.

Så, hur anpassar jag min lösning till din fråga? Istället för den ena variabeln som jag använde för att få den föregående raden för Remain_Toner_Black använd fyra för färgerna svart, cyan, magenta och gul. Och gå med i tabellen Skrivare och kunder som du redan har gjort. Glöm inte beställningen senast så är du klar.




  1. SSMS SQL SERVER Management Studio 2012 startstopp

  2. Varför kan jag inte logga in i MYSQL med phpmyadmin?

  3. Varför är mina buffrade punkter avlånga och inte cirklar i SQL Server Management Studio - Spatial Results

  4. MySQL visar inte databaser skapade i phpMyAdmin