2012-02-17 179 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个最廉价的物品。