За последние 24 часа нас посетили 62903 программиста и 1743 робота. Сейчас ищут 954 программиста ...

mysql запрос с условием

Тема в разделе "MySQL", создана пользователем amf1k, 7 сен 2014.

  1. amf1k

    amf1k Активный пользователь

    С нами с:
    20 авг 2014
    Сообщения:
    86
    Симпатии:
    0
    есть таблица friends
    поля:
    id
    sender - Отправитель
    addressee - Получатель
    status - Статус заявки (По умолчанию 0 - заявка отправлена,) и 1 - заявка принята

    Нужно вытвщить всех друзей определенного пользователя

    id - 1
    sender - Вася
    addressee - Петя
    status - 1

    id - 2
    sender - Коля
    addressee - Вася
    status - 1

    помогите создать запрос, чтобы вытащить друзей Васи?
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Если я правильно понял, то должно быть как-то так:
    Код (PHP):
    1. SELECT 
    2.   (CASE WHEN `sender` = 'Вася'  THEN `addressee` ELSE `sender` END) AS `friend`
    3. FROM 
    4.   `friends` 
    5. WHERE (`sender` = 'Вася' OR `addressee` = 'Вася') AND `status` = 1; 
    Потестировать можно тут.
     
  3. amf1k

    amf1k Активный пользователь

    С нами с:
    20 авг 2014
    Сообщения:
    86
    Симпатии:
    0
    что то не то, на выходе нет записей(
     
  4. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Так может вы реальный дамп покажите? А еще лучше, если в песочницу закините.
     
  5. amf1k

    amf1k Активный пользователь

    С нами с:
    20 авг 2014
    Сообщения:
    86
    Симпатии:
    0
    --
    -- Дамп данных таблицы `friends`
    --

    INSERT INTO `friends` (`id`, `sender`, `addressee`, `status`) VALUES
    (1, Толик, Вася, 0),
    (2, Вася, Коля, 1),
    (3, Саня, Вася, 1),
    (4, Вася, Петя, 0);
     
  6. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Ну, разницы аж никакой и всё работает нормально. Значит есть какие-то недочеты у вас в коде. Включите вывод всех ошибок.
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    1. для этой структуры предлагаю использовать UNION, вместо CASE + OR
    http://sqlfiddle.com/#!2/5c6c8/3
    при наличии индексов будет работать очень быстро, в отличие от варианта с OR

    2. еще предлагаю при подтверждении статуса создавать "зеркальную" запись. то есть все подтвержденные заявки должны выглядеть как две записи
    Вася, Петя, 1
    Петя, Вася, 1
    тогда SELECT упрощается - достаточно искать только по adressee или только по sender.
    оптимизировать надо часто используемые запросы, а проверка связей будет явно более востребована, чем изменение связей.

    3. логично предположить, что пара (sender, adressee) уникальна!!! это хорошие кандидаты на primary key, поле id можно убрать.