Как я могу получить идентификатор строк, которые имеют значения MAX и MIN в SQL - PullRequest
4 голосов
/ 05 октября 2011

Я пытаюсь сделать запросы, которые использует мой веб-сайт, более эффективными.

Будучи немного расплывчатым в отношении SQL, я не совсем научился использовать вложенные запросы, но мне только что удалось получить что-то, что довольно близко к тому, что я хочу.

Я продаю гитары, у меня есть большая база данных со всеми продуктами с различными вариантами отделки, перечисленными индивидуально. Элементы имеют уникальные идентификаторы в дБ, но сгруппированы по их названию, например, стандарт Gibson Les Paul указан в моем дБ 7 раз с 7 различными вариантами финиша. Не все варианты отделки обязательно будут иметь одинаковую цену, и не все варианты отделки обязательно будут в наличии.

На странице результатов поиска моего сайта я хочу показать:

1) Всего одна запись на продукт, т.е. 1 запись для Gibson LP Std, которая затем может быть связана с различными видами отделки.

2) Фактически отображаемый продукт должен либо быть самым дешевым вариантом отделки, ИЛИ самым дешевым на складе.

В настоящее время это работает на моем веб-сайте, но использует N + 1 запросов и, кажется, работает ужасно медленно, но для примера того, что я имею в виду, нажмите здесь: http://www.hartnollguitars.co.uk/search.asp?subcat=Gibson-Les-Pauls (если кровавая штука работает )

Первая часть в порядке, я могу просто сгруппировать заголовок в SQL, проблема в части 2.

Используя следующий запрос SQL, я могу получить самую низкую цену и самую высокую цену, и я посчитал, сколько существует вариантов, у меня также есть максимальный и минимальный уровни запасов.

results.Open "SELECT * FROM 
(SELECT *, count(id) as Variants, MAX(price) as highestPrice, MIN(price) as
lowestPrice, MAX(shopstock) as highestStock, MIN(shopstock) as lowestStock FROM 
products WHERE item LIKE '%"& replace([searchterm]," ","%") &"%' GROUP BY item) 
AS UnknownVar LIMIT 40", conn, 3, &H0001

Что мне нужно сделать, это получить значение идентификатора для строк, представляющих максимальные и минимальные значения акций и цен.

Мне, в принципе, нужно иметь возможность работать, если / или на нем есть логика, и я не уверен, возможно ли это.

Итак, мне нужно сказать

if Item_With_Cheapest_Price is in stock, display this as the thumbnail & link
else 
display first item in price sorted list where stock >=1

Мне также нужно отступить, если на складе нет ни одного покрытия, покажите самый дешевый.

База данных - MySQL, использующая соединения ODBC, в настоящее время я пишу сценарии для Classic ASP, но нацеливаюсь на обновление до .NET, как только разберусь, как !!! : -)

Ответы [ 2 ]

0 голосов
/ 08 октября 2011

Знаете ли вы концепцию dens_rank? Если бы не я, я мог бы объяснить это вам. Ваша цель может быть решена с помощью следующих запросов. Посмотрите на это.

SELECT id,
MIN(stock) KEEP (DENSE_RANK FIRST ORDER BY stock,price) "Lowest"
,MAX(stock) KEEP (DENSE_RANK LAST ORDER BY stock,price) "Highest"
FROM products
GROUP BY id;
0 голосов
/ 05 октября 2011

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

order by case
    when stock > 0 then 0
    when stock < 0 then 1
    end ascending,
    price ascending

Я не проверял синтаксис, но это идея. Вы можете Google Case для получения дополнительной информации.

Что касается остальных требований, мне понадобится структура таблицы, чтобы лучше понять ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...