#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. это выглядит интересно. Раздражающе, мое внимание было отвлечено от этой проблемы сейчас на другие вещи, но я обязательно вернусь к этому. Спасибо за всю помощь 🙂