2012-02-17 4 views
0

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

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 Server. Он работал отлично в учебнике, но не в моем случае

+3

MySQL позволяет это, но sql-сервер этого не делает. Но это нормально, так как вы не должны делать это в MySQL в любом случае. –

+0

Какой должен быть ответ для следующего случая. asweet 30 продавец1, bsweet 30 продавец2, abc 20 продавец3, dsweet 40 продавец4 –

ответ

2

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

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

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

+0

спасибо, что это сработало хорошо. так что просто для любопытства, что бы вы предложили иметь лучшую работу? – test

+1

Условия поиска, такие как '= 'something'' (" equi-search ") или' LIKE', что-то% ''(prefix-search) могут быть ускорены индексами B-tree. Взгляните на [Индексирование SQL LIKE Filters] (http://use-the-index-luke.com/sql/where-clause/searching-for-ranges/like-performance-tuning).Таким образом, лучшее, что вы можете сделать для своей работы, - ограничить себя обычными и префиксными поисками. Если вы абсолютно ** должны ** искать в суффиксе, может помочь индексация вычисленного столбца (то есть наоборот исходного столбца). Если вам нужен инфикс-поиск, по существу нет никакой помощи, даже из полнотекстового индекса в общем случае. –

+0

Большое спасибо за эту информацию :) – test

0

Добавить group by items.name в нижних

+0

, который просто дает мне результат внутреннего запроса:/ – test

1

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

Попробуйте это:

SELECT 
    i.[name], 
    MIN(i.[cost]) 
FROM [items] i 
WHERE i.name LIKE '%sweet%' 
GROUP BY i.[name] 
3

Что вам нужно, это наихудшие статьи затрат, то порядка по стоимости и выберите первую строку.

Select top 1 name, cost 
from items 
where name like '%sweets%' 
order by cost desc 
+2

Не возвращает ли это только одну строку, независимо от того, сколько элементов имеет имя типа «сладкий», ? Хотя я, возможно, неправильно понимаю ОП, что не очень понятно. – LiquidPony

+0

Да, вы правы, это вернет только 1 строку. Но тогда я, возможно, и не понимаю ОП. Чтобы возвратить кратность, обновите запрос до 'select top 10 ...' – Ryan

3

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

select * 
from items 
where name like '%sweets%' and cost 
in ( 
    select min(cost) 
    from items 
    where name like '%sweets%') 
+0

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

+1

Ну, я надеялся, что мы должны показать оба в этом случае, иначе нам нужно топ 1. –

3

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

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

Это позволит получить вам 10 дешевые элементы, которые соответствуют %sweets.