我正在尝试做一些看似简单的事情,但我的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对。 当用户执行搜索时:始终设置类型,但其他值可能包含也可能不包含在搜索条件中。
答案 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%') )