есть таблица friends поля: id sender - Отправитель addressee - Получатель status - Статус заявки (По умолчанию 0 - заявка отправлена,) и 1 - заявка принята Нужно вытвщить всех друзей определенного пользователя id - 1 sender - Вася addressee - Петя status - 1 id - 2 sender - Коля addressee - Вася status - 1 помогите создать запрос, чтобы вытащить друзей Васи?
Если я правильно понял, то должно быть как-то так: Код (PHP): SELECT (CASE WHEN `sender` = 'Вася' THEN `addressee` ELSE `sender` END) AS `friend` FROM `friends` WHERE (`sender` = 'Вася' OR `addressee` = 'Вася') AND `status` = 1; Потестировать можно тут.
-- -- Дамп данных таблицы `friends` -- INSERT INTO `friends` (`id`, `sender`, `addressee`, `status`) VALUES (1, Толик, Вася, 0), (2, Вася, Коля, 1), (3, Саня, Вася, 1), (4, Вася, Петя, 0);
Ну, разницы аж никакой и всё работает нормально. Значит есть какие-то недочеты у вас в коде. Включите вывод всех ошибок.
1. для этой структуры предлагаю использовать UNION, вместо CASE + OR http://sqlfiddle.com/#!2/5c6c8/3 при наличии индексов будет работать очень быстро, в отличие от варианта с OR 2. еще предлагаю при подтверждении статуса создавать "зеркальную" запись. то есть все подтвержденные заявки должны выглядеть как две записи Вася, Петя, 1 Петя, Вася, 1 тогда SELECT упрощается - достаточно искать только по adressee или только по sender. оптимизировать надо часто используемые запросы, а проверка связей будет явно более востребована, чем изменение связей. 3. логично предположить, что пара (sender, adressee) уникальна!!! это хорошие кандидаты на primary key, поле id можно убрать.