where子句匹配同一个表中的2行以获得结果

时间:2013-01-28 18:29:04

标签: mysql sql

我有一个搜索查询,我需要修改并适应我们的自定义配置文件系统,该系统使用下表:

  profile_key | profile_value        | user_id
       1      |    test1             |  10
       2      |    test2             |  10
       3      |    ["test3","test4"] |  10

我需要在where子句中添加一些匹配所有行的内容(取决于用户在搜索表单中定义的内容)来获取user_id,如:

 select user_id from table where (profile_key = 1 && profile_value regexp 'test1') && (profile_key = 3 && profile_value regexp 'test4')

我需要获取所有user_id,如果它匹配所有已定义的profile_key和正则表达式。

任何想法我怎么能做到这一点?

问候。

3 个答案:

答案 0 :(得分:1)

您说profile_key应为13。这是不可能的。

您需要使用OR,而不是AND

SELECT user_id 
FROM   table 
WHERE  ( profile_key = 1 && profile_value REGEXP 'test1' ) OR ( 
       profile_key = 3 && profile_value REGEXP 'test4' ) 

答案 1 :(得分:1)

最简单的方法是使用EXISTS

SELECT user_id
FROM users
WHERE EXISTS (SELECT 1 FROM profiles WHERE profile_key = 1 
    AND profile_value regexp 'test1' AND profiles.user_id = users.user_id)
AND EXISTS (SELECT 1 FROM profiles WHERE profile_key = 3 
    AND profile_value regexp 'test4' AND profiles.user_id = users.user_id)

您还可以使用INNER JOIN完成此操作,对于您要匹配的每一行一次:

SELECT user_id
FROM users
INNER JOIN profiles p1 ON users.user_id = p1.user_id
INNER JOIN profiles p2 ON users.user_id = p2.user_id
WHERE p1.profile_key = 1 AND p1.profile_value regexp 'test1'
AND p2.profile_key = 3 AND p2.profile_value regexp 'test4'

答案 2 :(得分:0)

使用“IN”怎么样呢?

select user_id 
from table 
where (profile_key = 1 && 'test1' IN profile_value) 
    && (profile_key = 3 && 'test4' IN profile_value )