Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите, пж, составить запрос
 
 автор: Zilog   (07.03.2010 в 03:12)   письмо автору
 
 

Есть:
группа (groupID, ..)
товар (artID, artSize)
сезон (seasonID, ...)
цена (priceID,artID, groupID, seasonID, price)

Логика такая: в группе несколько товаров, у товаров в разный сезон может быть разная цена.
Хочу получить минимальную цену на ОДИН товар в определённый сезон, у которых поле artSize равно, скажем, 2.

как бы это осуществить одним запросом? м?

Буду благодарен за помощь.

  Ответить  
 
 автор: Zilog   (08.03.2010 в 00:51)   письмо автору
 
   для: Zilog   (07.03.2010 в 03:12)
 

вот что есть на данный момент, и возвращает оно все цены.
а надо одну цену, минимальную, и того товара, у которого art.size=2.

SELECT DISTINCT  gr.*, cat.*, ss.*, art.*, pr.* 
FROM groups AS gr
LEFT OUTER JOIN categories AS cat ON (cat.catID= gr.catID) 
LEFT OUTER JOIN seasons AS ss ON (ss.catID = cat.catID AND ss.from<= 1267997158 AND ss.to>= 1267997158) 
LEFT OUTER JOIN articles AS art ON (art.catID= cat.catID AND art.size=2) 
LEFT OUTER JOIN prices AS pr ON (pr.artID = art.artID AND pr.ssID=ss.ssID) WHERE gr.typeID=11


Буду благодарен за помощь.

  Ответить  
 
 автор: Trianon   (08.03.2010 в 01:06)   письмо автору
 
   для: Zilog   (08.03.2010 в 00:51)
 

похоже, у Вас лишний LEFT. Либо artsize =2 нужно убирать во WHERE

И первая строка должна быть
SELECT MIN(pr.price)
FROM...

  Ответить  
 
 автор: Zilog   (08.03.2010 в 01:31)   письмо автору
 
   для: Zilog   (08.03.2010 в 00:51)
 

SELECT DISTINCT  gr.*, cat.*, ss.*, art.*, 
MIN (pr.pirce)
FROM groups AS gr 
LEFT OUTER JOIN categories AS cat ON (cat.catID= gr.catID)  
LEFT OUTER JOIN seasons AS ss ON (ss.catID = cat.catID AND ss.from<= 1267997158 AND ss.to>= 1267997158)  
LEFT OUTER JOIN articles AS art ON (art.catID= cat.catID)  
LEFT OUTER JOIN prices AS pr ON (pr.artID = art.artID AND pr.ssID=ss.ssID) WHERE gr.typeID=11  


Спасибо, но так он мне только одну запись возвращает. А должен несколько (по groups)

Да, AND art.size=2 в WHERE неправильно переносить, ведь нужно при отсутствии товара был NULL.

  Ответить  
 
 автор: Zilog   (08.03.2010 в 03:25)   письмо автору
 
   для: Zilog   (08.03.2010 в 01:31)
 

если в конец добавим

GROUP BY gr.grID
HAVING MIN(pr.price)

то работает почти как надо - только выпадают строки, где нет цен на товар, или товаров нет... что делать?

UPD.
а если убрать HAVING MIN(pr.price), и добавить в SELECT - MIN(pr.price), то
всё как надо, но:
1. Имя товара не совпадает с его мин. ценой
2. в результатах поле называется "MIN(pr.price)", что становится недоступным, если разбирать выдачу через mysql_fetch_object... как бы имя поля нормальное заполучить?

  Ответить  
 
 автор: phmaster   (08.03.2010 в 14:12)   письмо автору
 
   для: Zilog   (08.03.2010 в 03:25)
 

Ну так конечно они выпадать будут вы же везде левое соединение применяйте, причем левая таблица в этом соединении - содержит первичные ключи

  Ответить  
 
 автор: Zilog   (08.03.2010 в 15:52)   письмо автору
 
   для: phmaster   (08.03.2010 в 14:12)
 

>Ну так конечно они выпадать будут вы же везде левое соединение применяйте, причем левая таблица в этом соединении - содержит первичные ключи

ммм. Буду признателен, если поясните чайнику пальцем, что делать. уже всю голову сломал. :-/

  Ответить  
 
 автор: Trianon   (08.03.2010 в 15:56)   письмо автору
 
   для: Zilog   (08.03.2010 в 01:31)
 

SELECT DISTINCT gr.*, cat.*, ss.*, art.*, MIN (pr.pirce)

так писать нельзя.
Возникает семантическая неоднозначность агрегатного запроса.
Последний раз я стер язык, объясняя, почему так происходит, в теме
http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=70433
начиная от (16.12.2009 в 14:10)
Сильно советую прочитать и вникнуть.

PS. Чтобы через mysql_fetch получить MIN(price) имеет смысл этому полю поставить алиас
SELECT MIN(pr.price) AS minprice

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования