我有一张像
这样的表格id keyword_id value category_id asset_id
1 2 abc.jpg 4424 479
2 3 Jpeg 4424 479
3 4 400*600 4424 479
4 2 def.jpg 4424 603
5 3 Jpeg 4424 603
6 4 500*700 4424 603
我想根据多个对来获取值,例如(keyword id = 3 and value like '%Jpeg%'
)和(keyword id = 2 and value like '%abc%'
)。
这应该只返回asset_id 479
的一个值,因为它符合两个条件。
我正在运行像
这样的查询SELECT DISTINCT asset_id FROM asset_keyword_table where category_id = 4424
AND (( keyword_id = 2 AND value LIKE '%abc%') AND ( keyword_id = 3 AND
value LIKE '%Jpeg%'));
但EXPLAIN此查询返回Impossible WHERE子句。 是什么方法让这个工作。 这个查询是由BE代码生成的,所以块喜欢这个可以很多 -
( keyword_id = 2 AND value LIKE '%abc%')
取决于用户输入。由AND或OR分隔的块也由User确定。不能使用别名,因为块数没有限制。
有人可以帮忙吗?
答案 0 :(得分:2)
您需要过滤与您的条件匹配的总行数。
SELECT Asset_ID
FROM asset_keyword_table
WHERE category_id = 4424
AND
(( keyword_id = 2 AND value LIKE '%abc%')
OR (keyword_id = 3 AND value LIKE '%Jpeg%'))
GROUP BY Asset_ID
HAVING COUNT(*) = 2 -- number of rows that matched the condition
这里是Demo。
答案 1 :(得分:0)
嵌套查询应该能够提供所需的结果:
SELECT DISTINCT asset_id FROM asset_keyword_table WHERE
( category_id = 4424 AND keyword_id = 2 AND value LIKE '%abc%' )
AND asset_id IN
( SELECT DISTINCT asset_id FROM asset_keyword_table WHERE
category_id = 4424 AND keyword_id = 3 AND value LIKE '%Jpeg%' )
/* OR asset_id IN
( SELECT DISTINCT asset_id FROM asset_keyword_table WHERE
category_id = 4424 AND keyword_id = 4 AND value LIKE '%500%' ) */