|
|
|
| Есть:
группа (groupID, ..)
товар (artID, artSize)
сезон (seasonID, ...)
цена (priceID,artID, groupID, seasonID, price)
Логика такая: в группе несколько товаров, у товаров в разный сезон может быть разная цена.
Хочу получить минимальную цену на ОДИН товар в определённый сезон, у которых поле artSize равно, скажем, 2.
как бы это осуществить одним запросом? м?
Буду благодарен за помощь. | |
|
|
|
|
|
|
|
для: 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
|
Буду благодарен за помощь. | |
|
|
|
|
|
|
|
для: Zilog
(08.03.2010 в 00:51)
| | похоже, у Вас лишний LEFT. Либо artsize =2 нужно убирать во WHERE
И первая строка должна быть
SELECT MIN(pr.price)
FROM... | |
|
|
|
|
|
|
|
для: 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 в 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... как бы имя поля нормальное заполучить? | |
|
|
|
|
|
|
|
для: Zilog
(08.03.2010 в 03:25)
| | Ну так конечно они выпадать будут вы же везде левое соединение применяйте, причем левая таблица в этом соединении - содержит первичные ключи | |
|
|
|
|
|
|
|
для: phmaster
(08.03.2010 в 14:12)
| | >Ну так конечно они выпадать будут вы же везде левое соединение применяйте, причем левая таблица в этом соединении - содержит первичные ключи
ммм. Буду признателен, если поясните чайнику пальцем, что делать. уже всю голову сломал. :-/ | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|