Выбор с несколькими условиями WHERE в одном столбце

Виталий Синицын
Виталий Синицын
  • Сообщений: 8
  • Последний визит: 20 января 2025 в 02:50

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

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

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 должен выглядеть примерно так:

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

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

Редактировалось: 1 раз (Последний: 20 января 2025 в 02:13)
Владислав Кузнецов
Владислав Кузнецов
  • Сообщений: 16
  • Последний визит: 20 января 2025 в 19:38

Вы можете использовать

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' 

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

Редактировалось: 1 раз (Последний: 20 января 2025 в 02:14)
Егор Савельев
Егор Савельев
  • Сообщений: 18
  • Последний визит: 20 января 2025 в 23:17

Использовать:

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 
Редактировалось: 1 раз (Последний: 20 января 2025 в 02:14)
Авторизуйтесь, чтобы писать на форуме.

Заявка на услуги DST

Наш специалист свяжется с вами, обсудит оптимальную стратегию сотрудничества,
поможет сформировать бизнес требования и рассчитает стоимость услуг.

Адрес

Ижевск, ул. Воткинское шоссе, д. 170 Е, Технопарк Нобель, офис 1117

8 495 1985800
Заказать звонок

Режим работы: Пн-Пт 10:00-19:00

info@dstglobal.ru

Задать вопрос по почте

Укажите ваше имя
Укажите ваше email
Укажите ваше телефон