当同一行中的2列等于2个值时,SQL搜索行

时间:2018-09-02 23:04:12

标签: database phpmyadmin

请允许我在数据库中保存此表:

----------------------------------
| 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')

但这没用,这是正确的方法吗?

谢谢

2 个答案:

答案 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