我正在大脑冻结,原本我认为这是一个简单的查询。
我有一张如下表格:
ID DETAILID NAME
-------------------------------------------------
1 1 Sed ut perspiciatis unde
2 1 omnis iste natus error
3 1 sit voluptatem accusantium
4 1 doloremque laudantium
5 2 totam rem aperiam
6 2 labore et dolore
7 3 voluptate velit esse
8 3 occaecati cupiditate non
9 3 culpa qui officia
10 3 placeat facere possimus
11 3 Nam libero tempore
我想用LIKE'%%'多次搜索NAME字段(LIKE的数量将是随机的)但我只想返回一个明显的DETAILID,其中LIKE都在DETAILID相同的记录中找到。
我绕圈而行,无处可去。有人可以帮忙吗?
答案 0 :(得分:1)
此查询为您提供与所有LIKE条件匹配的DETAILID
SELECT DETAILID
FROM
(
select DETAILID, 1 as WhichMatch
from tbl
where NAME LIKE '%a%'
UNION ALL
select DETAILID, 2 as WhichMatch
from tbl
where NAME LIKE '%b%'
UNION ALL
select DETAILID, 3 as WhichMatch
from tbl
where NAME LIKE '%c%'
) SQ
GROUP BY DETAILID
HAVING COUNT(DISTINCT WhichMatch) = 3
答案 1 :(得分:0)
因为您正在寻找所有“LIKE”值,您需要在它们之间进行OR,COUNT(*)以查看匹配的数量,以及每个ID的GROUP BY以及与之匹配的HAVING算你期待...
select
DETAILID,
count(*) RecsFound
from
YourTable
where
NAME LIKE '%a%'
or NAME LIKE '%b%'
or NAME LIKE '%c%'
or NAME LIKE '%d%'
group by
DetailID
having
RecsFound = 4
正如您所提到的,它可能是随机数量的“like”限定符,并且听起来像是动态构造的SQL查询。因此,请确保您的HAVING子句计数与您要测试的条目匹配。
编辑 - 修改后的答案将IF()移至部分
select
DETAILID
from
YourTable
where
if( NAME LIKE '%a%', 1, 0 )
+ if( NAME LIKE '%b%', 1, 0 )
+ if( NAME LIKE '%c%', 1, 0 )
+ if( NAME LIKE '%d%', 1, 0 ) = 4
我想我是从一个多行表中查看它,其中每个条目都是您正在测试的元素。你希望所有的值都在同一个ROW中匹配所有LIKE ...虽然你已经接受了另一个答案,但这是另一种选择,没有使用所有不同的联盟......
此外,通过所有联盟通过表ONCE而不是2,3,4或更多,然后有一个组...它点击记录ONCE,符合所有4个条件并且完成。
答案 2 :(得分:-1)
这不会起作用吗?
SELECT DISTINCT DETAILID FROM MyTable WHERE NAME LIKE '%something%' or NAME LIKE '%sometingelse%
答案 3 :(得分:-1)
嗯,在阅读了对其他两个答案的评论之后,我相信你需要这个 -
在查询中使用 AND 代替 OR -
SELECT DISTINCT DETAILID
FROM MyTable
WHERE NAME LIKE '%something%'
AND NAME LIKE '%someting1%'
AND NAME LIKE '%someting2%'
答案 4 :(得分:-1)
我认为最简单的解决方案是在多个查询中执行此操作。 使用WHERE选择不同id的count()并选择不带id的count()而不使用where条件。 比较这两个将是一个完美的方式来确定'detialids'的所有“名称”是否与你的LIKE相匹配