Проблема с данными запроса в таблице

0

У меня есть таблица 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")

Помогает ли мне?
Спасибо.

Теги:

4 ответа

2
Лучший ответ

Вы можете использовать трюк с 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.

4

Вместо ограничения, я думаю, вы имеете в виду состояние. Вам нужно использовать 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
  • 1
    Я не думаю, что это то, что парень получал. Пример был немного плох, хотя ... Я думаю, что он хочет, это int_values для которых существуют обе эти комбинации.
  • 0
    @ Матти: хорошая мысль, добавил запрос для этого.
1

Понимание проблемы...

Подумайте о своем запросе. Если вы заберете круглую скобку (потому что все условия "и" ), она будет выглядеть так:

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")
1

Возможно, это не самый чистый метод:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню