Подтвердить что ты не робот

ВЫБОР с несколькими условиями ГДЕ на одном столбце

Хорошо, я думаю, что я мог бы пропустить что-то очевидное/простое здесь... но мне нужно написать запрос, который возвращает только записи, которые соответствуют нескольким критериям в одном столбце...

Моя таблица - очень простая установка привязки для применения флагов к пользователю...

ID   contactid  flag        flag_type 
-----------------------------------
118  99         Volunteer   1 
119  99         Uploaded    2 
120  100        Via Import  3 
121  100        Volunteer   1  
122  100        Uploaded    2

и т.д.... в этом случае вы увидите, что оба контакта 99 и 100 отмечены как "Волонтер" и "Загруженные"...

Что мне нужно сделать, так это возвратить те, которые были связаны только с контактами, которые соответствуют нескольким критериям, введенным через форму поиска... контактные должны соответствовать всем выбранным флагам... в моей голове SQL должен выглядеть примерно так:/p >

SELECT contactid 
 WHERE flag = 'Volunteer' 
   AND flag = 'Uploaded'...

но... ничего не возвращает... Что я здесь делаю неправильно?

4b9b3361

Ответ 1

Вы можете использовать GROUP BY и HAVING COUNT(*) = _:

SELECT contact_id
FROM your_table
WHERE flag IN ('Volunteer', 'Uploaded', ...)
GROUP BY contact_id
HAVING COUNT(*) = 2 -- // must match number in the WHERE flag IN (...) list

(при условии, что contact_id, flag является уникальным).

Или используйте соединения:

SELECT T1.contact_id
FROM your_table T1
JOIN your_table T2 ON T1.contact_id = T2.contact_id AND T2.flag = 'Uploaded'
-- // more joins if necessary
WHERE T1.flag = 'Volunteer'

Если список флагов очень длинный, и есть много совпадений, то первое, вероятно, быстрее. Если список флагов невелик, и есть несколько совпадений, вы, вероятно, обнаружите, что второе быстрее. Если производительность является проблемой, попробуйте проверить как свои данные, чтобы увидеть, какая из них лучше всего работает.

Ответ 2

Использование:

  SELECT t.contactid
    FROM YOUR_TABLE t
   WHERE flag IN ('Volunteer', 'Uploaded')
GROUP BY t.contactid
  HAVING COUNT(DISTINCT t.flag) = 2

Главное, чтобы подсчет t.flag должен был равняться количеству аргументов в предложении IN.

Использование COUNT(DISTINCT t.flag) в том случае, если не существует единственного ограничения на комбинацию контактов и флага - если нет возможности дублирования, вы можете опустить DISTINCT из запроса:

  SELECT t.contactid
    FROM YOUR_TABLE t
   WHERE flag IN ('Volunteer', 'Uploaded')
GROUP BY t.contactid
  HAVING COUNT(t.flag) = 2

Ответ 3

Рассмотрим использование INTERSECT следующим образом:

SELECT contactid WHERE flag = 'Volunteer' 
INTERSECT
SELECT contactid WHERE flag = 'Uploaded'

Я думаю, что это самое логичное решение.

Ответ 4

не может реально видеть вашу таблицу, но флаг не может быть как "Волонтером", так и "Загружен". Если в столбце имеется несколько значений, вы можете использовать

WHERE flag LIKE "%Volunteer%" AND flag LIKE "%UPLOADED%"

на самом деле не применимо, видя форматированную таблицу.

Ответ 5

Попробуйте использовать этот альтернативный запрос:

SELECT A.CONTACTID 
FROM (SELECT CONTACTID FROM TESTTBL WHERE FLAG = 'VOLUNTEER')A , 
(SELECT CONTACTID FROM TESTTBL WHERE FLAG = 'UPLOADED') B WHERE A.CONTACTID = B.CONTACTID;

Ответ 6

SELECT contactid, Count(*) 
FROM <YOUR_TABLE> WHERE flag in ('Volunteer','Uploaded')  
GROUP BY contactid 
HAVING count(*)>1;

Ответ 7

Используйте это: например:

select * from ACCOUNTS_DETAILS
where ACCOUNT_ID=1001
union
select * from ACCOUNTS_DETAILS
where ACCOUNT_ID=1002

Ответ 8

AND вернет вам ответ только тогда, когда в столбце присутствуют как volunteer, так и uploaded. В противном случае он вернет значение null...

попробуйте использовать OR в вашем заявлении...

SELECT contactid  WHERE flag = 'Volunteer' OR flag = 'Uploaded'

Ответ 9

Измените AND на OR. Простая ошибка. Подумайте об этом, как о простом английском, я хочу выбрать что-либо с тем, что соответствует тому или иному.

Ответ 10

Иногда вы не можете видеть дерево для деревьев:)

Оригинальный SQL..

SELECT contactid 
 WHERE flag = 'Volunteer' 
   AND flag = 'Uploaded'...

Должно быть:

SELECT contactid 
 WHERE flag = 'Volunteer' 
   OR flag = 'Uploaded'...

Ответ 11

select purpose.pname,company.cname
from purpose
Inner Join company
on purpose.id=company.id
where pname='Fever' and cname='ABC' in (
  select mname
  from medication
  where mname like 'A%'
  order by mname
); 

Ответ 12

ваш код:

SELECT contactid 
WHERE flag = 'Volunteer' AND flag = 'Uploaded' [...]

не будет работать, поскольку вы не указали имя таблицы. выполнение вернет сообщение об ошибке.

и если вы хотите, чтобы оба поисковых запроса отображались, ваш код должен выглядеть примерно так.

SELECT * FROM (your_table_name) WHERE flag = 'Volunteer' OR flag = 'Uploaded';

а не так, потому что он всегда будет возвращать false   SELECT * FROM (your_table_name) WHERE flag = 'Volunteer' AND flag = 'Uploaded';

вы также можете сделать это

SELECT * FROM (your_table_name) 
WHERE flag = 'Volunteer' OR flag = 'Uploaded' 
ORDER BY contactid, flag asc; 

(по возрастанию, вы также можете изменить его на desc, если хотите, чтобы он отображался в порядке убывания)