在多个键值对的同一个表上进行SELECT

时间:2018-01-25 10:22:39

标签: mysql

我有一张像

这样的表格
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确定。不能使用别名,因为块数没有限制。

有人可以帮忙吗?

2 个答案:

答案 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%' ) */

SQL Fiddle