Оператор И MySQL?

У меня проблема с запросом sql. У меня есть такая таблица:

user_id  exception
  2        3
  2        4 

Я хочу выбрать user_id's, который существует за исключением 3 AND 4

SELECT user_id 
FROM table 
WHERE exception = 3 
  AND exception = 4 

не работает.

С английским языком беда. «И» иногда означает «Или». В математике и компьютерах есть четкая разница. Вам нужно OR в этой ситуации. Но, так как нет оператора «Оба». Отсюда и решения HAVING COUNT... ниже.

Rick James 14.03.2019 10:42
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
3
1
84
7

Ответы 7

Ваш текущий запрос выбирает user_id, где исключение равно 3 и 4, что никогда не может быть правдой, поскольку одна ячейка содержит только одно значение.

Чтобы выбрать user_id, у которых есть строки 3 и 4, вам нужно выполнить запрос, где исключение составляет 3 или 4, и GROUP BYuser_id. Затем вы можете использовать агрегатную функцию COUNT(), чтобы найти, где есть две строки — это будут строки, в которых исключение составляет 3 и 4.

Это предполагает, что существует уникальная связь между user_id и exception, а это означает, что комбинация user_id и exception никогда не встречается дважды.

SELECT user_id 
FROM table 
WHERE exception IN (3, 4)
GROUP BY user_id
HAVING COUNT(user_id) = 2

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

maximus26 04.03.2019 19:36

Кажется, я неправильно понял ваш вопрос. Если это так, вам нужно GROUP BY и посмотреть, где COUNT() равно двум. Я отредактирую свой ответ.

Qirel 04.03.2019 20:10

Используйте агрегацию и having:

SELECT user_id 
FROM table 
WHERE exception in (3, 4)
GROUP BY user_id
HAVING COUNT(DISTINCT exception) = 2; 

Это возвращает пользователей, у которых есть оба исключения. Если нет дубликатов для пользователей/исключений, используйте HAVING COUNT(*) = 2.

использование существует

  select t1.* from table_name t1
  where exists ( select 1 from table_name t2 where t1.user_id=t2.user_id
                                            where exception in (3,4)
                                            having count(distinct exception)=2)

Приведенный ниже запрос даст вам пользователей, которые столкнулись с обоими исключениями 3 и 4, если это то, что вы ищете.

select user_id from table where exception=3 
intersect 
select user_id from table where exception=4

Или попробуйте

Выберите user_id из таблицы a, если исключение = 3 и существует (выберите user_id из таблицы b, где исключение = 4 и a.user_id = b.user_id)

Это очень хороший подход. Однако, к сожалению, в MySQL нет INTERSECT.

Thorsten Kettner 04.03.2019 19:51

Я дам вам одно предложение

Создайте два столбца (поля) в таблице базы данных с именами исключение_1 и исключение_2. Теперь ваша таблица выглядит так, как показано ниже,

user_id  exception_1  exception_2
  2        3            4
  2        4            3
  3        3            4 

а затем выполните приведенный ниже запрос.

SELECT user_id FROM table WHERE exception_1 = 3 AND exception_2 = 4 

Ответ Qirel неверен, потому что они неправильно поняли требование. maximus26 хочет, чтобы идентификаторы пользователей имели исключение 3 А ТАКЖЕ 4, то есть оба. И ваше предложение состоит в том, чтобы добавить столбец в таблицу, чтобы избыточно хранить значения? Это ужасная идея.

Thorsten Kettner 04.03.2019 20:04

Нет, нет возможности получить данные user_id с помощью оператора AND из одного столбца. Он (maximus26) пишет запрос, в котором исключение равно 3 и 4, что никогда не может быть правдой, поскольку значение одной ячейки не может быть 3 И 4 одновременно. В противном случае ему нужно создать два столбца в качестве моего ответа.

iamatstackoverflow 04.03.2019 20:11

Нет. Посмотрите на ответ Гордона. Вот как получить идентификаторы с исключениями 3 и 4. Qirel обновил свой ответ, чтобы он соответствовал ответу Гордона. forpas добавил ответ, который делает то же самое, только немного отличается. zulfi123786 демонстрирует еще один хороший подход, который не работает только в MySQL. rad добавил еще одно решение. Все эти решения работают. Нет необходимости менять модель данных. Ваше предложение просто очень, очень плохое. Это правильно, что вы не можете использовать оператор AND, как пытался maximus26, но вы все равно можете получить идентификаторы пользователей, которые имеют как исключение 3, так и 4.

Thorsten Kettner 04.03.2019 21:14

С group by и min и max:

select user_id 
from tablename 
where exception in (3, 4)
group by user_id
having min(exception) = 3 and max(exception) = 4;

Вам нужен self join:

select u1.user_id from 
tbl_user u1 join tbl_user u2
on u1.user_id = u2.user_id
where u1.exception = 3 and u2.exception = 4

Другие вопросы по теме