Как мне получить идентификатор строк с МАКСИМАЛЬНЫМИ и МИНИМАЛЬНЫМИ значениями в SQL

#mysql #sql

#mysql #sql

Вопрос:

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

Будучи немного расплывчатым в 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 '%"amp; replace([searchterm]," ","%") amp;"%' GROUP BY item) 
AS UnknownVar LIMIT 40", conn, 3, amp;H0001
  

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

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

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

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

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

База данных — это MySQL, использующий ODBC-соединения, в настоящее время я пишу сценарии на классическом ASP, но стремлюсь перейти на .NET, как только я выясню, как это сделать !!! 🙂

Комментарии:

1. чтобы иметь представление, сколько записей в таблице элементов?

2. stivlo; Всего несколько тысяч продуктов, но сгруппированное значение item (т.Е. Стандарт Gibson Les Paul) должно иметь не более 20 вариантов завершения.

3. Я подозревал это. Не имеет отношения к вашему вопросу, но причиной медлительности является эта часть запроса, в которой элемент ТИПА ‘%»amp; replace ([searchterm],» «,»%» — поскольку знак% находится перед термином, индексы не могут использоваться, и MySQL придется проверять каждый отдельныйстрока . Взгляните на полнотекстовый поиск

4. Спасибо Стивло, я посмотрел на это, но теперь я не могу получить разумные результаты с помощью запросов из нескольких слов, например, поиск по Gibson LEs Paul просто генерирует ВСЕ записи Gibson. Используя WHERE MATCH (item) ПРОТИВ (‘»amp; [searchterm] amp;»‘ В ЛОГИЧЕСКОМ РЕЖИМЕ)

5. Откуда требуется получить максимальную цену?

Ответ №1:

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

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

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

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

Комментарии:

1. Ах, это может помочь упростить ситуацию. Я проверю это завтра, нужно бежать сейчас. Я получаю довольно хорошие результаты с GROUP_CONCAT, который, похоже, генерирует массив элементов внутри группы. Это полезно, если порядок по регистру может позволить мне получить эти массивы в правильном порядке, это сэкономит сортировку массива и может дать мне именно то, что мне нужно… Не могу вернуться к этому сейчас до следующей недели! 🙁

Ответ №2:

Вы знаете концепцию dense_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;
  

Комментарии:

1. Привет, это выглядит интересно, не могли бы вы подробнее рассказать о том, что он на самом деле делает?

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

3. попробуйте это download.oracle.com/docs/cd/B19306_01/server.102/b14200 /…

4. это выглядит интересно. Раздражающе, мое внимание было отвлечено от этой проблемы сейчас на другие вещи, но я обязательно вернусь к этому. Спасибо за всю помощь 🙂