匹配多个值时,返回属于键值表中记录的所有列

时间:2010-08-12 14:12:10

标签: mysql

我正在尝试做一些看似简单的事情,但我的SQL技能有限:)

我在MySQL中有一个表,其中包含如下所示的键值对:

 ID    |  Record_ID  |    Key    |  Value
  1    |       1     |   type    |  person
  2    |       1     |   name    |  Henrik
  3    |       1     |  skills   |  Not any sql skills
  4    |       1     |   date    |  Today
 ...
 100   |      12     |   type    |  something else
 101   |      12     |  format   |  text
 102   |      13     |   type    |  color
 103   |      13     |   size    |  127

我想执行匹配类似的搜索:

key = type,value = person 和 key = name,值类似Henrik% 和 key =技能,值LIKE%sql%

应该返回属于Record_ID = 1的所有行。

请注意:每种记录类型都有固定数量的键值对,例如:人员记录总是有4对。 当用户执行搜索时:始终设置类型,但其他值可能包含也可能不包含在搜索条件中。

1 个答案:

答案 0 :(得分:0)

使用自我加入:

SELECT DISTINCT t.*
   FROM TABLE t
   JOIN TABLE t2 ON t2.record_id = t.record_id
                     AND (    (t2.key = 'type' AND t2.value = 'person')
                              OR (t2.key = 'name' AND t2.value LIKE 'Henrik%')
                              OR (t2.key = 'skills' AND t2.value LIKE '%sql%')  )

使用IN:

SELECT t.*
   FROM TABLE t
  WHERE t.record_id IN (SELECT x.record_id
                                    FROM TABLE x
                                   WHERE (    (t2.key = 'type' AND t2.value = 'person')
                              OR (t2.key = 'name' AND t2.value LIKE 'Henrik%')
                              OR (t2.key = 'skills' AND t2.value LIKE '%sql%') )