2011-08-30 36 views
4

我有一个大的查询,但我最大的问题在于这个小部分。SQL当分组记录有多个匹配字符串时选择

ItemID是外键的主项表 - 它不是唯一的。这个查询没有做我想做的事(行不能有全部4个名字),但它说明了我在找什么。

Select masteritemid from itemsgrouptable 
where itemname like 'Item 1' 
And itemname like 'Item 2' 
And itemname like 'Item 3' 
And itemname like 'Item 4' 

我想拉一个itemid只有4列出的记录与该ID存在。我当前的方法根据ID将同一个表连接在一起4次,每个部分查看1个字符串...这是非常低效的。

+1

你确定你的意思'和'?因为从你的查询来看,它看起来像你想要一个项目,因为你将所有东西都放在一起 – NullUserException

+1

我还会争辩说任何依靠通过'LIKE'进行字符串比较的东西都不能“高效” – NullUserException

回答

3

使用一个正则表达式的匹配:

select masteritemid from itemsgrouptable 
where itemname regexp 'Item [1234].*' 

这将匹配任何ITEMNAME开始或者用 “项目1” 或 “项目2” 或 “第3项的” 或 “项目4”

1

每隔一段时间就会出现一次。不像我所期望的那么简单。

首先,如果它是完全匹配,则不要执行“LIKE”语句。 Like语句比直接比较效率低。

其次,你可以做到你要求在GROUP BY什么/ HAVING子句:

SELECT masteritemid FROM itemsgrouptable 
GROUP BY masteritemid 
HAVING COUNT(itemname) = 4 
WHERE itemname IN ('Item 1','Item 2','Item 3','Item 4') 

基本上你是由masteritemid把所有的项目,并限制该进行分组设置,所有4(或任何数量的“item#”匹配)都在您指定的“IN”子句中。一种整洁的把戏。

+0

如果if他们不是确切的? '项目1'可以选择是野生梳理,所以如果他们想要所有的落地灯,地板蜡等等,都可以是'落地灯'%...你可以混合进来和喜欢吗? –

+0

如果不是完全匹配,你怎么知道你的所有条件都被打了? – feathj

0

TRY

SELECT masteritemid FROM itemsgrouptable 
WHERE itemname REGEXP '^Item[:digit]?+' 

Reference

相关问题