2012-02-17 106 views
0

此刻我正在修改我的SQL。我希望在項目表中進行查詢,在那裏我想獲得最便宜的糖果。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 Server。它的工作在本教程的罰款,但沒有我的情況下

+3

MySQL允許這個,但sql服務器不。但沒關係,因爲你不應該在MySQL中這樣做。 – 2012-02-17 18:51:56

+0

以下情況應該是什麼答案。 asweet 30 seller1,bsweet 30 seller2,abc 20 seller3,dsweet 40 seller4 – 2012-02-17 18:59:07

回答

2

這會給你最廉價的行(S)在所有領域,而不僅僅是成本:

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

BTW,後綴搜索LIKE %something會引起全表掃描(和性能相當差)。

+0

謝謝你,這工作得很好。所以只是爲了好奇心,你會有什麼建議有更好的表現? – test 2012-02-17 19:03:31

+1

可以通過B-tree索引加快搜索條件,如'='something''(「equi-search」)或'LIKE'something%''(前綴搜索)。看看[索引SQL LIKE過濾器](http://use-the-index-luke.com/sql/where-clause/searching-for-ranges/like-performance-tuning)。所以,你可以爲自己的表現做最好的事情就是限制自己進行平等和前綴搜索。如果你絕對**必須**在後綴上搜索,索引計算列(與原始列相反)可能會有所幫助。如果你需要中綴搜索,基本上沒有任何幫助,甚至在一般情況下甚至不能使用全文索引。 – 2012-02-17 19:16:00

+0

非常感謝你的這個信息:) – test 2012-02-17 19:16:46

0

底部

+0

只是簡單地給出了內部查詢的結果:/ – test 2012-02-17 18:59:53

1

添加group by items.name你看到的錯誤描述,你需要做什麼 - 一個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

這不僅僅返回一行,不管有多少項具有「sweet」 ?雖然我可能會誤解OP,但這不是很清楚。 – LiquidPony 2012-02-17 18:55:43

+0

是的,你是對的,這隻會返回1行。但是,我可能不會理解OP。要返回倍數,將查詢更新爲'select top 10 ...' – Ryan 2012-02-17 18:59:10

3

這應該有效。

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

在成本關係的情況下,可能需要在外部select上的top 1。 – 2012-02-17 18:55:30

+1

那麼,我希望我們應該顯示在這種情況下,否則我們需要頂部1. – 2012-02-17 18:57:56

3

你不需要子查詢來做到這一點。您可以通過價格只是爲了表:

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

這將讓你匹配%sweets的10個最廉價的物品。