Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Найти MAX последних 9-ти записей / 18 сообщений из 18, страница 1 из 1
28.10.2008, 19:13:46
    #35621434
ZiB
ZiB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти MAX последних 9-ти записей
Найти MAX последних 2-x записей

Вот такая таблица "coming":
id - date - tovar - sum
1 - 20080101 - ТоварА - 600
2 - 20080102 - ТоварБ - 1
3 - 20080103 - ТоварА - 500
4 - 20080104 - ТоварА - 4

Делаю такой запрос:
select tovar,MAX(sum) as c from coming group by 1 order by date DESC,id DESC limit 0,2
Но такой запрос лимитом своим отрезает не пробег с конца таблицы вверх до второго товара,
а сами товары обрезает.


А как мне составить запрос, чтобы получить результат:
ТоварА - 500
ТоварБ - 1
...
Рейтинг: 0 / 0
28.10.2008, 19:16:56
    #35621441
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти MAX последних 9-ти записей
ZiBНайти MAX последних 2-x записей

Вот такая таблица "coming":
id - date - tovar - sum
1 - 20080101 - ТоварА - 600
2 - 20080102 - ТоварБ - 1
3 - 20080103 - ТоварА - 500
4 - 20080104 - ТоварА - 4

Делаю такой запрос:
select tovar,MAX(sum) as c from coming group by 1 order by date DESC,id DESC limit 0,2
Но такой запрос лимитом своим отрезает не пробег с конца таблицы вверх до второго товара,
а сами товары обрезает.


А как мне составить запрос, чтобы получить результат:
ТоварА - 500
ТоварБ - 1Не вижу логики, почему именно эти две записи? Они не последние и не максимльные...
...
Рейтинг: 0 / 0
29.10.2008, 06:28:02
    #35621779
Найти MAX последних 9-ти записей
ZiBНайти MAX последних 2-x записей

Вот такая таблица "coming":
id - date - tovar - sum
1 - 20080101 - ТоварА - 600
2 - 20080102 - ТоварБ - 1
3 - 20080103 - ТоварА - 500
4 - 20080104 - ТоварА - 4

Делаю такой запрос:
select tovar,MAX(sum) as c from coming group by 1 order by date DESC,id DESC limit 0,2
Но такой запрос лимитом своим отрезает не пробег с конца таблицы вверх до второго товара,
а сами товары обрезает.


А как мне составить запрос, чтобы получить результат:
ТоварА - 500
ТоварБ - 1

Если я всё правильно понял, то что-то такое должно быть:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
select v0.*
  from (
         select c0.*
           from coming c0
           join coming c1
             on c0.tovar = c1.tovar
            and c0.date <= c1.date
            and c0.sum >= c1.sum
          group by c0.id, c0.date, c0.tovar, c0.sum
         having count( 1 ) <=  2 
       ) v0
  left outer join
       (
         select c0.*
           from coming c0
           join coming c1
             on c0.tovar = c1.tovar
            and c0.date <= c1.date
            and c0.sum >= c1.sum
          group by c0.id, c0.date, c0.tovar, c0.sum
         having count( 1 ) <=  2 
       ) v1
    on v0.tovar = v1.tovar
   and v0.sum < v1.sum
 where v1.id is null

На работоспособность не проверял!!! Всё на уровне идеи!!!

З.Ы.
При желании, можно сильно упростить.
...
Рейтинг: 0 / 0
29.10.2008, 07:11:58
    #35621796
ZiB
ZiB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти MAX последних 9-ти записей
Эти две записи последние по дате,
в рабочей версии программы надо будет смотреть макс значение в последних 9-ти приходов,
а тут я упростил до последних двух приходов.

Спасибо Добрый Э - Эх,
я увидел строчку "having count(1) <= 2"
и мне уже кажется что именно так и будет работать,
вечером проверю
...
Рейтинг: 0 / 0
29.10.2008, 09:55:17
    #35622034
ZiB
ZiB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти MAX последних 9-ти записей
Работает!!!!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
$query = mysql_query("
select v0.idprice as name,MAX(v0.sum) as c
  from (
         select c0.*
           from coming c0
           join coming c1
             on c0.idprice = c1.idprice
            and c0.date <= c1.date
            and c0.sum >= c1.sum
          group by c0.id, c0.date, c0.idprice, c0.sum
         having count(1) <= 3
       ) v0
  left outer join
       (
         select c0.*
           from coming c0
           join coming c1
             on c0.idprice = c1.idprice
            and c0.date <= c1.date
            and c0.sum >= c1.sum
          group by c0.id, c0.date, c0.idprice, c0.sum
         having count(1) <= 3
       ) v1
    on v0.idprice = v1.idprice
   and v0.sum < v1.sum
 where v1.id is null
 group by 1
",$p) or die(mysql_error());

...
Рейтинг: 0 / 0
29.10.2008, 09:57:26
    #35622042
ZiB
ZiB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти MAX последних 9-ти записей
Только я не доганяю как работает,
но работает.
А как быстро такой запрос будет совершатЦо при скажем 5000 приходов??? (записей в coming)
...
Рейтинг: 0 / 0
29.10.2008, 10:04:22
    #35622061
Найти MAX последних 9-ти записей
Ну, честно скажу - решение не из быстрых. Я бы даже сказал наоборот - из разряда крайне медленных.
Нужно думать над оптимизацией запроса.
Если в итоговую выбрку нужны только два поля: товар и макс(сумма) (как было в начальном вопросе), то можно вдвое сократить запрос, повысив тем самым и его производительность примерно в теже два раза:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select v0.tovar, max(sum) as sum
  from (
         select c0.*
           from coming c0
           join coming c1
             on c0.tovar = c1.tovar
            and c0.date <= c1.date
            and c0.sum >= c1.sum
          group by c0.id, c0.date, c0.tovar, c0.sum
         having count( 1 ) <=  2 
       ) v0
 group by v0.tovar

Если же нужны все поля исходной таблицы, то тогда оптимизировать можно только через полное изменение логики запроса.
...
Рейтинг: 0 / 0
29.10.2008, 10:07:55
    #35622073
ZiB
ZiB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти MAX последних 9-ти записей
Нет, не работает )-:
вот при таком варианте:
coming
id - date - tovar - sum
1 - 20080101 - ТоварА - 600
2 - 20080102 - ТоварБ - 1
3 - 20080103 - ТоварА - 500
4 - 20080102 - ТоварБ - 3
5 - 20080102 - ТоварБ - 2
6 - 20080102 - ТоварБ - 1
7 - 20080104 - ТоварА - 700

Получается:
ТоварА - 500
ТоварБ - 2

Это из двух последних приходов, он пропустил приход под id 7
...
Рейтинг: 0 / 0
29.10.2008, 10:11:33
    #35622085
Найти MAX последних 9-ти записей
"Не верю!" (с) :)

давай типы полей смотреть. Суммы точно что=-то из числовых типов? Случайно не символьный тип там?
...
Рейтинг: 0 / 0
29.10.2008, 10:19:16
    #35622101
Найти MAX последних 9-ти записей
Код: plaintext
Select * from coming;
IDDATETOVARSUM101-Янв-2008ТоварА600202-Янв-2008ТоварБ1303-Янв-2008ТоварА500402-Янв-2008ТоварБ3502-Янв-2008ТоварБ2602-Янв-2008ТоварБ1704-Янв-2008ТоварА700

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
select v0.tovar, max(sum) as sum
  from (
         select c0.*
           from coming c0
           join coming c1
             on c0.tovar = c1.tovar
            and c0.date <= c1.date
            and c0.sum >= c1.sum
          group by c0.id, c0.date, c0.tovar, c0.sum
         having count( 1 ) <=  2 
       ) v0
 group by v0.tovar

Query finished, retrieving results...

 TOVAR   SUM
------   ---
ТоварА    700  
ТоварБ      1  

 2  row(s) retrieved
...
Рейтинг: 0 / 0
29.10.2008, 10:52:26
    #35622204
Найти MAX последних 9-ти записей
о-о-о-о-о, кажись понял в чем косяк... :)

Счас попробую исправить.
...
Рейтинг: 0 / 0
29.10.2008, 10:53:56
    #35622209
Найти MAX последних 9-ти записей
просто несовсем понятно, как ранжировать записи в случае, если в один день было несколько приходов одного и того же товара? Что вообще является первичным при сортировке? ID прихода? Дата прихода?
...
Рейтинг: 0 / 0
30.10.2008, 06:50:04
    #35624423
ZiB
ZiB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти MAX последних 9-ти записей
Добрый Э - Эхпросто несовсем понятно, как ранжировать записи в случае, если в один день было несколько приходов одного и того же товара? Что вообще является первичным при сортировке? ID прихода? Дата прихода?

Да вы все правильно поняли. первичным дата, id вторичен
вот что я сделал и у меня работает!!!

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
$query = mysql_query("

select *,sum2-sum3 as sum4,kol2-kol3 as kol4,TRUNCATE(sum3-kol3*(sum2/kol2),2) as pri from (

select TMC.id, price.name, SUM(kol2) as kol2,SUM(sum2) as sum2, SUM(kol3) as kol3,SUM(sum3) as sum3,SUM(c) as c  from
(
(select price.id,0 as kol2,0 as sum2,SUM(basespec.kol) as kol3,SUM(basespec.sum) as sum3,0 as c from basespec left join price on price.id = basespec.idprice left join type on type.id = price.idtype where type.typeN = 't' group by 1)
UNION
(select price.id,SUM(coming.kol) as kol2,SUM(coming.sum) as sum2,0 as kol3,0 as sum3,0 as c from coming left join price on price.id = coming.idprice group by 1)
UNION
(select price.id,0,0,0,0,TRUNCATE(MAX(v0.sum/v0.kol),2) as c
  from (
         select c0.*
           from coming c0
           join coming c1
             on c0.idprice = c1.idprice
            and c0.date <= c1.date
            and c0.id <= c1.id
            and c0.sum/c0.kol >= c1.sum/c1.kol
          group by c0.id, c0.date, c0.idprice
         having count(1) <= 2
       ) v0
  left outer join
       (
         select c0.*
           from coming c0
           join coming c1
             on c0.idprice = c1.idprice
            and c0.date <= c1.date
            and c0.id <= c1.id
		and c0.sum/c0.kol >= c1.sum/c1.kol
          group by c0.id, c0.date, c0.idprice
         having count(1) <= 2
       ) v1
    on v0.idprice = v1.idprice
   and v0.sum/v0.kol < v1.sum/v1.kol
 left join price on price.id = v0.idprice
 where v1.id is null
 group by 1)
) TMC
left join price on price.id = TMC.id
group by 1
) TMP
",$p) or die(mysql_error());

извините это не упращенный вариант, а скопированный прям из php скрипта,
седня буду сидеть на работу, если время позволит попробую его оптимизировать/сократить.

Скорость работы скрипта не очень важна... именно этого.
Этот скрипт для вывода таблицы - отчета оборотки, отчету позволительно работать долго.
Я еще не реализовал вывод остатков на начало периода (пока вообще периода нет).
Цены которые буду той выборкой находится будут хранится в прайсе и обновлятся каждый раз при добавлении нового прихода (т.е. запрос будет на конкретный id товара и уже запрос будет легче).
Так что большое вам спасибо Добрый Эх за помощ, даже не наю куда я без вас.
...
Рейтинг: 0 / 0
30.10.2008, 07:20:39
    #35624433
Найти MAX последних 9-ти записей
Ну, если первично сортируем по дате, а данные на одну дату - по ID, то вот тебе испраленная версия запроса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select v.tovar, max(sum) as max_sum
  from (
         select c0.*
           from coming c0
           join coming c1
             on c0.tovar = c1.tovar
            and (c0.date < c1.date 
                 or 
                 c0.date = c1.date and c0.id <= c1.id
                 )
          group by c0.id, c0.date, c0.tovar, c0.sum
          having count( 1 ) <=  2 
       ) v
 group by v.tovar

Соответственно, если нужны все поля таблицы, то запрос примет вид:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
select v0.*
  from (
         select c0.*
           from coming c0
           join coming c1
             on c0.tovar = c1.tovar
            and (c0.date < c1.date 
                 or 
                 c0.date = c1.date and c0.id <= c1.id
                 )
          group by c0.id, c0.date, c0.tovar, c0.sum
         having count( 1 ) <=  2 
       ) v0
  left outer join
       (
         select c0.*
           from coming c0
           join coming c1
             on c0.tovar = c1.tovar
            and (c0.date < c1.date 
                 or 
                 c0.date = c1.date and c0.id <= c1.id
                 )
          group by c0.id, c0.date, c0.tovar, c0.sum
         having count( 1 ) <=  2 
       ) v1
    on v0.tovar = v1.tovar
   and v0.sum < v1.sum
 where v1.id is null
...
Рейтинг: 0 / 0
30.10.2008, 10:27:56
    #35624780
Найти MAX последних 9-ти записей
Кстати, с учетом того, что LIMIT в подзапросах рулит, то можно переписать запрос именно через LIMIT в подзапросе.
Производительности это должно пойти на пользу :)
...
Рейтинг: 0 / 0
30.10.2008, 16:24:26
    #35626012
ZiB
ZiB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти MAX последних 9-ти записей
Нет, мне не нужны все поля,
все остальные поля будут братЦо из другой таблицы.

вот мой окончательный запрос

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
$query = mysql_query("

select *,sum2-sum3 as sum4,kol2-kol3 as kol4,TRUNCATE(sum3-kol3*(sum2/kol2),2) as pri from (

select TMC.id, price.name, SUM(kol2) as kol2,SUM(sum2) as sum2, SUM(kol3) as kol3,SUM(sum3) as sum3,SUM(c) as c  from
(
(select price.id,0 as kol2,0 as sum2,SUM(basespec.kol) as kol3,SUM(basespec.sum) as sum3,0 as c from basespec left join price on price.id = basespec.idprice left join type on type.id = price.idtype where type.typeN = 't' group by 1)
UNION
(select price.id,SUM(coming.kol) as kol2,SUM(coming.sum) as sum2,0 as kol3,0 as sum3,0 as c from coming left join price on price.id = coming.idprice group by 1)
UNION
(select price.id,0,0,0,0,TRUNCATE(MAX(v0.c),2) as c
  from (
         select c0.idprice,c0.sum/c0.kol as c
           from coming c0
           join coming c1
             on c0.idprice = c1.idprice
            and c0.date < c1.date
            or (c0.id <= c1.id and c0.date = c1.date)
            and c0.sum/c0.kol >= c1.sum/c1.kol
          group by c0.id, c0.date, c0.idprice
         having count(1) <= 2
       ) v0
 left join price on price.id = v0.idprice
 group by 1)
) TMC
left join price on price.id = TMC.id
group by 1
) TMP
",$p) or die(mysql_error());

а структуру базы данных мою можно углядеть тут:
http://zibnv.homeip.net/salons/backup/salon_2008-10-28_17-19.sql

А саму программу: http://zibnv.homeip.net/salons/
...
Рейтинг: 0 / 0
31.10.2008, 04:59:34
    #35626808
Найти MAX последних 9-ти записей
ZiBНет, мне не нужны все поля,
все остальные поля будут братЦо из другой таблицы.

вот мой окончательный запрос

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
select *,sum2-sum3 as sum4,kol2-kol3 as kol4,TRUNCATE(sum3-kol3*(sum2/kol2), 2 ) as pri from (

select TMC.id, price.name, SUM(kol2) as kol2,SUM(sum2) as sum2, SUM(kol3) as kol3,SUM(sum3) as sum3,SUM(c) as c  from
(
(select price.id, 0  as kol2, 0  as sum2,SUM(basespec.kol) as kol3,SUM(basespec.sum) as sum3, 0  as c from basespec left join price on price.id = basespec.idprice left join type on type.id = price.idtype where type.typeN = 't' group by  1 )
UNION
(select price.id,SUM(coming.kol) as kol2,SUM(coming.sum) as sum2, 0  as kol3, 0  as sum3, 0  as c from coming left join price on price.id = coming.idprice group by  1 )
UNION
(select price.id, 0 , 0 , 0 , 0 ,TRUNCATE(MAX(v0.c), 2 ) as c
  from (
         select c0.idprice,c0.sum/c0.kol as c
           from coming c0
           join coming c1
             on c0.idprice = c1.idprice
            and c0.date < c1.date
            OR (c0.id <= c1.id and c0.date = c1.date)
            and c0.sum/c0.kol >= c1.sum/c1.kol
          group by c0.id, c0.date, c0.idprice
         having count( 1 ) <=  2 
       ) v0
 left join price on price.id = v0.idprice
 group by  1 )
) TMC
left join price on price.id = TMC.id
group by  1 
) TMP

а структуру базы данных мою можно углядеть тут:
http://zibnv.homeip.net/salons/backup/salon_2008-10-28_17-19.sql

А саму программу: http://zibnv.homeip.net/salons/
Несколько смущает то, как ты использовал OR. Ты уверен, что не забыл расставить скобок где надо?
...
Рейтинг: 0 / 0
31.10.2008, 08:09:43
    #35626868
ZiB
ZiB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти MAX последних 9-ти записей
Исправился, просто разбирался в логике запроса,
эксперементировал...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
select *,sum2-sum3 as sum4,kol2-kol3 as kol4,TRUNCATE(sum3-kol3*(sum2/kol2), 2 ) as pri from (

select TMC.id, price.name, SUM(kol2) as kol2,SUM(sum2) as sum2, SUM(kol3) as kol3,SUM(sum3) as sum3,SUM(c) as c  from
(
(select price.id, 0  as kol2, 0  as sum2,SUM(basespec.kol) as kol3,SUM(basespec.sum) as sum3, 0  as c from basespec left join price on price.id = basespec.idprice where price.type = '1' group by  1 )
UNION
(select price.id,SUM(coming.kol) as kol2,SUM(coming.sum) as sum2, 0  as kol3, 0  as sum3, 0  as c from coming left join price on price.id = coming.idprice group by  1 )
UNION
(select price.id, 0 , 0 , 0 , 0 ,TRUNCATE(MAX(v0.c), 2 ) as c
  from (
         select c0.idprice,c0.sum/c0.kol as c
           from coming c0
           join coming c1
             on c0.idprice = c1.idprice
            and (c0.date < c1.date or (c0.id < c1.id and c0.date = c1.date))
            and c0.sum/c0.kol >= c1.sum/c1.kol
          group by c0.id, c0.date, c0.idprice
         having count( 1 ) <=  2 
       ) v0
 left join price on price.id = v0.idprice
 group by  1 )
) TMC
left join price on price.id = TMC.id
group by  1 
) TMP

А вот такой запрос я сделал при поиске цены на текущий товар:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
		select TRUNCATE(MAX(v0.c), 2 ) as cp
			from (
				select c0.sum/c0.kol as c
					from coming c0
					join coming c1 on c0.idprice = c1.idprice
						and (c0.date < c1.date or (c0.id < c1.id and c0.date = c1.date))
						and c0.sum/c0.kol >= c1.sum/c1.kol
					where c0.idprice = '$priceid'
					group by c0.id, c0.date, c0.idprice
					having count( 1 ) <=  2 
				) v0

теперь структура другая (-:
http://zibnv.homeip.net/salons/backup/salon_2008-10-30_21-56.sql
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Найти MAX последних 9-ти записей / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]