SQL选择多个键/值

SQL选择多个键/值,sql,jpql,psql,Sql,Jpql,Psql,我有一个表PERSON\u PROPERTIES,类似于以下内容: | ID | KEY | VALUE | PERSON_ID | | 1 | fname | robert | 1 | | 2 | lname | redford | 1 | | 3 | fname | robert | 2 | |

我有一个表
PERSON\u 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       |
我想
选择与给定
fname
lname
匹配的
个人ID
(在JPQL或PSQL中)

我试过了

`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

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
按个人分组,仅选择具有这两个值的组


按个人分组,仅选择具有两个值的组。

另一种方法是使用subselect(注意,这是MS SQL 2012)


另一种方法是使用subselect(注意,这是MS SQL 2012)


自连接也会起作用<代码>不同的
用于重复的
个人id

SELECT DISTINCT a.PERSON_ID
FROM PERSON_PROPERTIES a JOIN PERSON_PROPERTIES b ON a.PERSON_ID = b.PERSON_ID
WHERE a.the_key = 'fname' AND a.value = 'robert'
AND b.the_key = 'lname' AND b.value = 'redford';

自连接也会起作用<代码>不同的
用于重复的
个人id

SELECT DISTINCT a.PERSON_ID
FROM PERSON_PROPERTIES a JOIN PERSON_PROPERTIES b ON a.PERSON_ID = b.PERSON_ID
WHERE a.the_key = 'fname' AND a.value = 'robert'
AND b.the_key = 'lname' AND b.value = 'redford';

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

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

您对此有何看法?

我们与一些同事一起得出了以下答案:

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

你觉得怎么样?

好的,我会把这个标记为正确答案。我做的唯一一件事就是稍微修改了一下

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

所以我得到了描述顺序。。然而我注意到它不会复制结果。。。我在同一年同一个月有两个帖子。。。现在我看不到了。。。有什么东西阻止了这一点吗?

好的,我将把它标记为正确答案。我做的唯一一件事就是稍微修改了一下

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

所以我得到了描述顺序。。然而我注意到它不会复制结果。。。我在同一年同一个月有两个帖子。。。现在我看不到了。。。有什么东西阻止了这一切吗?

快告诉我。又好又简洁。我从来没想过自己做这件事。真管用!非常感谢。比我快。又好又简洁。我从来没想过自己做这件事。真管用!谢谢大家!+1另一个好主意:)。我自己想避免SUM的过度使用,我在这个案例中尝试过。它似乎无法处理输入中的新数据。+1表示另一个好主意:)。我自己想避免SUM的过度使用,我在这个案例中尝试过。它似乎无法处理输入中的新数据。我是OP:)。由于p.PERSON\u ID的
组具有count(*)=2
运算符,因此它与“robert whatever”不匹配。为您在查询中输入的X个参数添加具有count(*)=X的
GROUP BY t.id,将强制选择您希望显示X次的结果。成功了。我是OP:)。由于p.PERSON\u ID的
组具有count(*)=2
运算符,因此它与“robert whatever”不匹配。为您在查询中输入的X个参数添加具有count(*)=X的
GROUP BY t.id,将强制选择您希望显示X次的结果。它成功了。