请允许我在数据库中保存此表:
----------------------------------
| userID | meta | value |
|--------------------------------|
| 1 | age | 20 |
| 1 | gender | M |
| 1 | country | Brazil |
| 2 | age | 21 |
| 3 | age | 22 |
| 3 | gender | F |
| 3 | country | Brazil |
----------------------------------
我想获取所有来自巴西且年龄超过18岁的用户ID ...
我尝试过类似的事情:
SELECT distinct(userID)
FROM table
WHERE (meta = age AND value > 18) AND (meta = country AND value = 'Brazil')
但这没用,这是正确的方法吗?
谢谢
答案 0 :(得分:0)
您编写查询的方式意味着您希望将(meta> 18)和(country = Brazil)都放在同一行上。但这永远不会发生,因为您的表不是那样构建的。
您可以执行以下操作以查询一个元/值对:
SELECT userID
FORM User
WHERE (meta = 'age' AND value > 18)
但是,如果要查询两个元/值对,则必须将表本身连接起来,像这样:
SELECT a.userID
FROM User AS a
JOIN User AS b ON a.userID = b.userID
WHERE (a.meta = 'age' AND a.value > 18)
AND (b.meta = 'country' AND b.value = 'Brazil')
通过这种方式,它“虚拟地”创建了一个表,在该表中,每行中将有两个meta值和两个age值。您可以使用WHERE
条件来验证两对meta和value上的条件。
上面的查询导致userID = 1和= 3(来自您在问题中输入的示例数据)。
答案 1 :(得分:0)
select userID
from Users
group by userID
having max(case when meta = 'age' and cast(value as int) = 18 then 1 end) = 1
and max(case when meta = 'country' and value = 'Brazil' then 1 end) = 1