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次的结果。它成功了。