我有一个搜索查询,我需要修改并适应我们的自定义配置文件系统,该系统使用下表:
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和正则表达式。
任何想法我怎么能做到这一点?
问候。
答案 0 :(得分:1)
您说profile_key
应为1
和3
。这是不可能的。
您需要使用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 )