MySQL查询用多个WHERE拉出不同的ID

时间:2011-01-31 11:36:37

标签: sql mysql correlation

我正在大脑冻结,原本我认为这是一个简单的查询。

我有一张如下表格:

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相同的记录中找到。

我绕圈而行,无处可去。有人可以帮忙吗?

5 个答案:

答案 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相匹配