phpMyAdmin
 sql >> база данни >  >> Database Tools >> phpMyAdmin

Изберете запис само ако този, преди да има по-ниска стойност, отнема твърде много време и се провали

Ето решение за вашия въпрос 1, което ще работи много по-бързо, тъй като имате много пълни сканирания на таблицата и зависими подзаявки. Тук ще имате най-много едно сканиране на таблица (и може би временна таблица, в зависимост от това колко големи са вашите данни и колко памет имате). Мисля, че можете лесно да го приспособите към вашия въпрос тук. Въпрос 2 (не съм го чел наистина) вероятно също е отговорен, тъй като сега е лесно просто да добавите where date_column = whatever

select * from (
    select
    t.*,
    if(@prev_toner < Remain_Toner_Black and @prev_sn = SerialNumber, 1, 0) as select_it,
    @prev_sn := SerialNumber,
    @prev_toner := Remain_Toner_Black
    from
    Table1 t
    , (select @prev_toner:=0, @prev_sn:=SerialNumber from Table1 order by SerialNumber limit 1) var_init
    order by SerialNumber, id
) sq  
where select_it = 1
  • вижте как работи на живо в sqlfiddle

РЕДАКТИРАНЕ:

Обяснение:

С този ред

    , (select @prev_toner:=0, @prev_sn:=SerialNumber from Table1 order by SerialNumber 

ние просто инициализираме променливите @prev_toner и @prev_sn в движение. Това е същото като изобщо да нямате този ред в заявката, а да пишете пред заявката

SET @prev_toner = 0;
SET @prev_sn = (select serialnumber from your_table order by serialnumber limit 1);
SELECT ...

И така, защо се прави заявката за присвояване на стойност на @prev_sn и защо се подрежда по сериен номер? Редът по е много важен. Без поръчка от няма гарантиран ред, в който се връщат редовете. Също така ще получим достъп до стойността на предишните редове с променливи, така че е важно същите серийни номера да са „групирани заедно“.

Колоните в клаузата за избор се оценяват една след друга, така че е важно първо да изберете този ред

if(@prev_toner < Remain_Toner_Black and @prev_sn = SerialNumber, 1, 0) as select_it,

преди да изберете тези два реда

@prev_sn := SerialNumber,
@prev_toner := Remain_Toner_Black

Защо така? Последните два реда присвояват само стойностите на текущите редове на променливите. Ето защо в този ред

if(@prev_toner < Remain_Toner_Black and @prev_sn = SerialNumber, 1, 0) as select_it,

променливите все още държат стойностите на предишните редове. И това, което правим тук, не е нищо повече от това да кажем „ако стойността на предишните редове в колона Remain_Toner_Black е по-малка от тази в текущия ред и серийният номер на предишните редове е същият като действителния сериен номер на редовете, връщане 1, иначе връщане 0."

След това можем просто да кажем във външната заявка "изберете всеки ред, където горното върна 1".

Като се има предвид вашата заявка, нямате нужда от всички тези подзаявки. Те са много скъпи и ненужни. Всъщност е доста безумно. В тази част на заявката

    SELECT  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 AND
                        c.ID <= a.ID) AS RowNumber
    FROM    Reports a

избирате цялата таблица иза всеки ред преброявате редовете в тази група. Това е зависима подзаявка. Всичко само за да има някакъв номер на ред. След това правите това втори път, само за да можете да се присъедините към тези две временни таблици, за да получите предишния ред. Наистина, нищо чудно, че изпълнението е ужасно.

И така, как да приспособя решението си към вашата заявка? Вместо една променлива, която използвах за получаване на предишния ред за Remain_Toner_Black, използвайте четири за цветовете черен, циан, магента и жълт. И просто се присъединете към таблицата Printers and Customers, както вече направихте. Не забравяйте поръчката до и сте готови.




  1. DBeaver
  2.   
  3. phpMyAdmin
  4.   
  5. Navicat
  6.   
  7. SSMS
  8.   
  9. MySQL Workbench
  10.   
  11. SQLyog
  1. Как да настроите двигателя за съхранение по подразбиране на InnoDB в XAMPP

  2. Експортирането на PhpMyAdmin не включва PRIMARY KEY като mysqldump

  3. Как мога да видя дали изборът на потребителя във теста е правилен?

  4. MySQL/phpMyAdmin замръзва от DELIMITER

  5. phpmyadmin, neginx error.log - Проверете, че групата www-data има достъп за четене и open_basedir