Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как получить последнюю цену по каждой позиции?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Помогите выбрать последнюю цену по каждой позиции
freegas
Отправлено: 28 Июля, 2016 - 21:52:04
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Июль 2016  


Помог: 0 раз(а)




Такая проблемка:
Есть БД с полями
- name - Наименование
- date - дата внесения изменения(в формате UNIX_TIMESTAMP)
- cena - Цена

Как получить последнюю цену по каждой позиции?
Типа:
red 5
green 10

(Отредактировано автором: 28 Июля, 2016 - 23:16:22)

 
 Top
Fart
Отправлено: 28 Июля, 2016 - 22:22:09
Post Id



Посетитель


Покинул форум
Сообщений всего: 324
Дата рег-ции: Июль 2016  


Помог: 10 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT name, MAX(date) AS date FROM `тут твоя таблица` WHERE name = 'red' OR name = 'green' GROUP BY name LIMIT 2


лимит можно убрать впринципе, но он лишний не будет. скажем так, что машине будет уже изначально дана команда ограничить количество строк в поиске...

(Отредактировано автором: 28 Июля, 2016 - 22:26:56)

 
 Top
OrmaJever
Отправлено: 28 Июля, 2016 - 22:46:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Fart пишет:
но он лишний не будет

будет, если добавиться еще один name то что будет? Да и where там не надо, и максимальную цену надо брать, а не дату
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT name, MAX(cena) AS cena FROM TABLE GROUP BY name


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
freegas
Отправлено: 28 Июля, 2016 - 22:53:48
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Июль 2016  


Помог: 0 раз(а)




OrmaJever пишет:
Fart пишет:
но он лишний не будет

будет, если добавиться еще один name то что будет? Да и where там не надо, и максимальную цену надо брать, а не дату
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT name, MAX(cena) AS cena FROM TABLE GROUP BY name



Спасибо добрые люди что откликнулись.

Но цену надо брать которая введена последняя (по полю - date - ).
Как написать универсально, если будут появляться ещё - name - (например yellow, blue и т.д.) т.е. не переписывая запрос чтобы он работал?

Таблица имеет вид:
id | name | date | cena
1 | red | 1469735179 | 500
2 | green | 1469735223 | 600
3 | red | 1469735438 | 5
4 | green | 1469735456 | 22

Проверил как работает этот запрос:
SELECT name, cena, MAX(date) AS date FROM tab GROUP BY name
выдаёт:
name cena date
green 600 1469735456
red 500 1469735438
Что не правильно, т.к. date не соответствуют ценам.

SELECT name, cena, MAX(date) AS date FROM `tab` WHERE name = 'red' OR name = 'green' GROUP BY name LIMIT 2 - выдаёт тоже самое.

(Отредактировано автором: 28 Июля, 2016 - 23:07:59)

 
 Top
OrmaJever
Отправлено: 28 Июля, 2016 - 23:23:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT name, cena FROM test WHERE id IN (SELECT max(id) FROM test GROUP BY name)


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
freegas
Отправлено: 28 Июля, 2016 - 23:28:45
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Июль 2016  


Помог: 0 раз(а)




OrmaJever пишет:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT name, cena FROM test WHERE id IN (SELECT max(id) FROM test GROUP BY name)



ЗАРАБОТАЛО!!!!
пол дня потратил, спасибо)) Жаль не могу пока "спасибо" нажать так как новичок(

(Отредактировано автором: 28 Июля, 2016 - 23:29:38)

 
 Top
Мелкий Супермодератор
Отправлено: 28 Июля, 2016 - 23:29:25
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Максимальный id не значит максимальную дату.

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT name, cena
  2.   FROM tablename
  3.   JOIN (
  4.     SELECT name, max(date) AS date
  5.       FROM tablename
  6.       GROUP BY name
  7. ) lastdate USING(name, date)

Нужен уникальный индекс по name & date


-----
PostgreSQL DBA
 
 Top
freegas
Отправлено: 28 Июля, 2016 - 23:33:02
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Июль 2016  


Помог: 0 раз(а)




Мелкий пишет:
Максимальный id не значит максимальную дату.

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT name, cena
  2.   FROM tablename
  3.   JOIN (
  4.     SELECT name, max(date) AS date
  5.       FROM tablename
  6.       GROUP BY name
  7. ) lastdate USING(name, date)

Нужен уникальный индекс по name & date


Спасибо, работает!!!
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB