SQL Поиск строки, когда 2 столбца в одной строке равны 2 значениям - PullRequest
0 голосов
/ 03 сентября 2018

давайте предположим, у меня есть эта таблица в моей базе данных:

----------------------------------
| 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 лет ...
Я пробовал что-то похожее на это:

SELECT distinct(userID)
FROM table
WHERE (meta = age AND value > 18) AND (meta = country AND value = 'Brazil')

Но это не сработало, какой правильный способ сделать это?

Спасибо

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018
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
0 голосов
/ 03 сентября 2018

То, как вы написали свой запрос, означает, что вы хотите, чтобы (мета> 18) и (страна = Бразилия) все были в одной строке. Но этого никогда не происходит, так как ваш стол не построен таким образом.

Вы можете сделать это для запроса одной пары мета / значений:

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

Таким образом, он «фактически создает» таблицу, в которой в каждой строке будет два мета-значения и два значения возраста. Вы можете использовать WHERE условия для проверки условий на двух парах мета и значения.

Приведенный выше запрос приводит к идентификатору пользователя = 1 и = 3 (из данных примера, которые вы указали в вопросе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...