Сложность SQL-запроса - PullRequest
       6

Сложность SQL-запроса

0 голосов
/ 17 февраля 2012

В данный момент я пересматриваю свой sql.Я хочу выполнить запрос в таблице предметов, где я хотел бы получить самые дешевые сладости.

select min(cost)
from items
where name like '%sweets%' and seller_id
in (    
    select seller_id
    from items
    where name like '%sweets%')

Приведенный выше результат возвращает самую дешевую цену.

Проблема:

Я хотел бы отобразить название конфет, например, это могут быть шоколадные или клубничные конфеты и т. Д., Но если я изменю первую строку запроса, чтобы выбрать имя, мин (стоимость), следующая ошибкаПроизведено:

Column 'items.name' is invalid in the select list because it is not contained 
in either an aggregate function or the GROUP BY clause.

Сейчас я просматриваю учебники по MYSQL, но работаю на сервере sql.В учебнике все работало нормально, но не в моем случае

Ответы [ 6 ]

3 голосов
/ 17 февраля 2012

Вам не нужен подзапрос, чтобы сделать это. Вы можете просто заказать столик по цене:

select top 10 * 
from items 
where name like '%sweets%'
order by price asc

Это даст вам 10 самых дешевых предметов, которые соответствуют %sweets.

3 голосов
/ 17 февраля 2012

Это должно работать.

select *
from items
where name like '%sweets%' and cost
in (    
    select min(cost)
    from items
    where name like '%sweets%')
3 голосов
/ 17 февраля 2012

То, что вам нужно, это наименее затратная позиция, затем заказ по стоимости и выберите первую строку.

Select top 1 name, cost
from items
where name like '%sweets%'
order by cost desc
2 голосов
/ 17 февраля 2012

Это даст вам все поля в самых дешевых строках, а не только в стоимости:

SELECT *
FROM items
WHERE
    name LIKE '%sweets%'
    AND cost = (SELECT MIN(cost) FROM items WHERE name LIKE '%sweets%')

Кстати, поиск по суффиксу LIKE %something приведет к полному сканированию таблицы (и, соответственно, к низкой производительности).

1 голос
/ 17 февраля 2012

Ошибка, которую вы видите, описывает, что вам нужно сделать - добавьте предложение GROUP BY к вашему запросу.Кроме того, насколько я могу судить, ваш подзапрос не нужен.

Попробуйте:

SELECT
    i.[name],
    MIN(i.[cost])
FROM [items] i
WHERE i.name LIKE '%sweet%'
GROUP BY i.[name]
0 голосов
/ 17 февраля 2012

Добавить group by items.name внизу

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