У меня есть таблица test
содержит 4 поля
+----+-----------+--------------+-----+
| id | int_value | string_value | qid |
+----+-----------+--------------+-----+
| 1 | 111 | Red | 1 |
| 2 | 111 | Green | 2 |
| 3 | 111 | Blue | 3 |
| 4 | 222 | Yellow | 1 |
| 5 | 222 | Red | 2 |
| 6 | 333 | Red | 1 |
| 7 | 333 | Green | 2 |
+----+-----------+--------------+-----+
Я хочу запросить int_value
, которые соответствуют текущим ограничениям.
(qid = 1 and string_value = 'Red') and (qid = 2 and string_value = "Green")
Результат может быть 111
и 333
Это не имеет смысла, если я применил это утверждение
select int_value from test
where (qid = 1 and string_value = 'Red')
and (qid = 2 and string_value = "Green")
Помогает ли мне?
Спасибо.
Вы можете использовать трюк с COUNT:
SELECT int_value
FROM test
WHERE (
(qid = 1 AND string_value = 'Red')
OR (qid = 2 AND string_value = 'Green')
)
GROUP BY int_value
HAVING COUNT(DISTINCT qid, string_value) = 2
Это полностью непроверено, поэтому я не уверен, что даже синтаксис верен. В основном он группирует результаты по int_value и находит любую группу, где столько результатов, сколько есть разных случаев. Вам нужно, чтобы числовое значение в предложении HAVING
соответствовало числу альтернатив OR
.
Вместо ограничения, я думаю, вы имеете в виду состояние. Вам нужно использовать OR
, так как нет ни одной строки, которая могла бы удовлетворить все условия WHERE
, как вы ее написали:
select int_value
from test
where (qid = 1 and string_value = 'Red')
or (qid = 2 and string_value = "Green")
Если вы хотите, чтобы int_values удовлетворяли обоим условиям, вы можете сделать это:
select int_value
from test
where (qid = 1 and string_value = 'Red')
or (qid = 2 and string_value = "Green")
group by int_value
having count(concat(distinct qid, string_value)) = 2
Понимание проблемы...
Подумайте о своем запросе. Если вы заберете круглую скобку (потому что все условия "и" ), она будет выглядеть так:
select int_value from test
where qid = 1 and string_value = 'Red'
and qid = 2 and string_value = "Green"
Кроме того, "и" имеет аналогичное свойство умножения: порядок факторов не влияет на результат, поэтому мы можем сделать следующее:
select int_value from test
where qid = 1 and qid = 2
and string_value = "Green" and string_value = 'Red'
Как вы можете видеть, невозможно, что одна запись может иметь значение qid равно 1 и 2; это просто нелогично. То же самое для string_value.
Простой ответ Таким образом, другие решения, которые используют OR, являются правильными (цифра qid равна 1 OR 2). Чтобы сделать вашу жизнь легкой, вот короткий ответ, который также устраняет дубликаты:
select distinct int_value from test
where (qid = 1 and string_value = 'Red')
or (qid = 2 and string_value = "Green")
Возможно, это не самый чистый метод:
select T1.int_value
from test T1
where exists ( select T2.int_value
from test T2
where T2.int_value = T1.int_value
and T2.qid = 1
and T2.string_value = 'Red'
)
and exists ( select T3.int_value
from test T3
where T3.int_value = T1.int_value
and T3.qid = 2
and T3.string_value = 'Green'
)
int_values
для которых существуют обе эти комбинации.