mysql запрос получить данные из таблицы b, если не существует в таблице a - PullRequest
0 голосов
/ 09 марта 2020

У меня есть две таблицы, группа и пользователь. Я хочу получить идентификатор username = 'rahim' из таблицы sql. Если username = 'rahim' существует в группе таблиц, то получить идентификатор из группы таблиц. Иначе, если существует в таблице user, затем получить идентификатор от пользователя таблицы.

Пользователь таблицы

user_id|username
1      |rahim
2      |hemala

Группа таблиц

uid    |group_name
1      |A
2      |B

Запрос

SELECT 
EXISTS(select * from user where username='rahim') as user_id,
EXISTS(select * from `group` where group_name='rahim') as group_id

результат:

user_id | group_id
      1 |        0

Если существует, он показывает 1. Это 1 относится к существованию. 1:exist , 0:not exist. Я хочу отфильтровать столбцы, которые равны только 1, и показать идентификатор пользователя, который также равен 1.

Ожидаемый результат:

user_id 
    1    

Этот 1 относится к идентификатору.

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 09 марта 2020

Используйте UNION ALL с NOT EXISTS:

select uid from `group` 
where group_name = 'rahim'
union all
select user_id from `user` 
where username = 'rahim'
and not exists (select 1 from `group` where group_name = 'rahim')

См. Демоверсию . Результаты:

| uid     |
| ------- |
| 1       |
1 голос
/ 09 марта 2020

Функция IF () возвращает значение, если условие имеет значение ИСТИНА, или другое значение, если условие имеет значение ЛОЖЬ.

IF(condition, value_if_true, value_if_false)

в этом запросе вы получите идентификатор

SELECT IF(user_id IS NULL , group_id, user_id) as id from (
    SELECT 
    (select id from user where username='rahim') as user_id, 
    (select uid from group where group_name='rahim') as group_id
    ) as temp
1 голос
/ 09 марта 2020

Как насчет перечисления значений, которые 1?

SELECT CONCAT_WS(',', 
                 (CASE WHEN EXISTS (select 1 from user where username = 'rahim') THEN 'USER' END),
                 (CASE WHEN EXISTS (select 1 from `group` where group_name = 'rahim') THEN 'GROUP' END)
                )

Что касается выбора столбцов, имеющих 1 - вы не можете сделать это с помощью одного запроса, потому что запрос возвращает фиксированный набор столбцов. Что вы можете сделать (как указано выше) - это вернуть значение с именами столбцов, которые вы ищете.

0 голосов
/ 09 марта 2020

Попробуйте это:

select * from (select case when 'rahim'=(select username from user1 where username='rahim') then 1 else 0 
end as user_id,
case when 'rahim'=(select group_name  from group1 where group_name ='rahim') then 1 else 0 
end as group_id)t; --Here you can put the filtration condition. 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...