ВЫБОР с несколькими условиями ГДЕ на одном столбце
Хорошо, я думаю, что я мог бы пропустить что-то очевидное/простое здесь... но мне нужно написать запрос, который возвращает только записи, которые соответствуют нескольким критериям в одном столбце...
Моя таблица - очень простая установка привязки для применения флагов к пользователю...
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'...
но... ничего не возвращает... Что я здесь делаю неправильно?
Ответы
Ответ 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, если хотите, чтобы он отображался в порядке убывания)