SQL SELECT多个键/值

时间:2014-05-15 10:40:27

标签: sql jpql psql

我有一张表PERSON_PROPERTIES,类似于以下内容:

|   ID   |   KEY    |    VALUE     |   PERSON_ID   |
|    1   |   fname  |    robert    |       1       |
|    2   |   lname  |    redford   |       1       |
|    3   |   fname  |    robert    |       2       |
|    4   |   lname  |    de niro   |       2       |
|    5   |   fname  |    shawn     |       3       |
|    6   |   nname  |    redford   |       3       |

我希望SELECT(在JPQL或PSQL中)PERSON_ID与给定的fnamelname匹配。

我已经尝试了

`SELECT DISTINCT *
FROM PERSON_PROPERTIES t0
WHERE ((((t0.key = 'fname')
AND (t0.value    = 'robert'))
AND ((t0.key     = 'lname')
AND (t0.value    = 'redford'))))`

但它没有给我任何价值。

我也试过

`SELECT DISTINCT *
FROM PERSON_PROPERTIES t0
WHERE ((((t0.key = 'fname')
AND (t0.value    = 'robert'))
OR ((t0.key      = 'lname')
AND (t0.value    = 'redford'))))`

但这样它会返回所有值。我不知道如何正确地转换查询,只给我1值。

5 个答案:

答案 0 :(得分:2)

SELECT PERSON_ID
FROM PERSON_PROPERTIES
group by PERSON_ID
having sum(case when key = 'fname' and value = 'robert' then 1 else 0 end) > 0
and sum(case when key = 'lname' and value = 'redford' then 1 else 0 end) > 0

由此人分组并仅选择具有两个值的人。

答案 1 :(得分:1)

另一种方法是使用subselect(谨慎,它是MS SQL 2012)

SELECT PERSON_ID
FROM PERSON_PROPERTIES
WHERE [Key] = 'fname' AND value = 'robert'
AND PERSON_ID in 
(SELECT PERSON_ID FROM PERSON_PROPERTIES WHERE [Key] = 'lname' AND value = 'redford')

Fiddle Demo

答案 2 :(得分:1)

与一些同事一起,我们得出了这个答案:

SELECT p.PERSON_ID
FROM PERSON_PROPERTIES p
WHERE (p.key = 'fname' AND p.value = 'robert')
OR (p.key = 'lname' AND p.value = 'redford')
GROUP BY p.PERSON_ID
HAVING count(*) = 2

你怎么看?

答案 3 :(得分:0)

SELF JOIN也可以解决问题。重复DISTINCT的{​​{1}}:

person_id

Demo

答案 4 :(得分:0)

好的,我会将此标记为正确的答案。我唯一做的就是修改了一下

SELECT Y.*, M.* FROM wp_postmeta as Y JOIN wp_postmeta AS M USING (`post_id`) 
 WHERE (Y.meta_key = 'agam_post_options_year' AND Y.meta_value = 2013) 
AND (M.meta_key = 'agam_post_options_month' AND M.meta_value BETWEEN 0 AND 12 ) 
GROUP BY Y.meta_value, M.meta_value ORDER BY M.meta_value+0 DESC

所以我得到了DESC订单..然而..我注意到它没有重复结果......我在同一年和同月有两个帖子...现在我看不到它...是那里有什么阻止了这个吗?