Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Простой-сложный select

#mysql #sql


таблица: m_frend дружит со sl_frend (в примере 883 дружит с 876), НО есть записи
в которых другие uid'ы дружат с m_frend (то есть в таком случае  m_frend будет sl_frend'ом).
Пример 856 дружит с 883.

mysql> select * from frends ;
+---------+----------+-------+
| m_frend | sl_frend | fr_st |
+---------+----------+-------+
|     883 |      876 |     1 |
|     880 |      875 |     1 |
|     881 |      877 |     1 |
|     856 |      883 |     1 |
|     859 |      883 |     1 |
|     860 |      883 |     1 |
|     883 |      879 |     1 |
|     883 |      880 |     1 |
|     883 |      881 |     2 |
+---------+----------+-------+
9 rows in set (0.01 sec)


Нужно в одном запросе, ОДНИМ СТОЛБИКОМ, вытянуть всех друзей 883 (тех с кем дружит
883), и ТЕХ КТО ДРУЖИТ С 883.

Такой вот калмбурчик вышел, надеюсь продлему описал понятно. И реально ли это сделать
(получить результат в одном стобце)?



Знаю что можно сначала получить 

mysql> select * from frends where m_frend=883 or sl_frend=883;
+---------+----------+-------+
| m_frend | sl_frend | fr_st |
+---------+----------+-------+
|     883 |      876 |     1 |
|     856 |      883 |     1 |
|     859 |      883 |     1 |
|     860 |      883 |     1 |
|     883 |      879 |     1 |
|     883 |      880 |     1 |
|     883 |      881 |     2 |
+---------+----------+-------+
7 rows in set (0.00 sec)


а потом в коде отбросить 883. но как результат запроса получить одним столбцом?

Я не знаю какой заголовок дать этому вопросу.
    


Ответы

Ответ 1



Для таких задач отлично подходит конструкция UNION. Запрос с ее использованием может иметь вот такой вид: SELECT sl_frend AS frend_id FROM frends WHERE m_frend = 883 UNION SELECT m_frend AS frend_id FROM frends WHERE sl_frend = 883; А вот и SQL Fiddle с рабочим примером.

Ответ 2



Тут с одной стороны все понятно с UNION. Но посмотрите немного глубже. Структура таблиц не соответсвует принципам реляционных баз данных. Чем у Вас левый товарищ может отличаеться от правого? Они же совершенно равноправны. Тут лучше использовать такую структуру Люди (ИД) Отношение товарищества (ИД) Товарищи (ИД_Отношения_товарищества, ИД_Человека) Конечно, тут придется использовать цже не UNION, а JOIN.

Ответ 3



select case m_frend when 883 then sl_frend else m_frend end as frend from frends where m_frend = 883 or sl_frend = 883

Комментариев нет:

Отправить комментарий