Всем привет! У меня есть таблица пользователей и таблица друзей. При запросе пользователя мне нужно получить статус является ли текущий пользователь другом выбранных из таблицы. Для этого я использовал подзапрос, потому что LEFT JOIN при таком условии не использует индексы и пробегает все поля. Это видно на картинке ниже:
Гораздо лучше работает подзапрос:
Но проблема появляется, когда мне нужно вывести не только статус дружбы (
f.`status`), но и поле
f.`accept`, чтобы уже на строне php определить, что если
f.`status` == 0 и
f.`accept` == 0, значит пользователь
f.`user_two` еще не отреагировал на заявку в друзья.
Ну или если
f.`status` == 0 и
f.`accept` == 1, значит пользователь
f.`user_two` отреагировал на заявку, но не принял её.
Проблема в том, что с помощью подзапроса нельзя вывести два поля в таблицу. Приходится делать либо два подзапроса, либо JOIN. Но в случае с двумя подзапросами ситуация становится хуже если вывести нужно не 2 поля, а 4. Не делать же 4 подзапроса?
У меня уже была мысль изменить поле `status` и сделать его по принципу:
- NULL - (в случае если нет записи в таблице друзей) - небыло заявок в друзья между пользователями.
- 0 - была заявка, но не было реакции второго пользователя
- 1 - заявка была принята - пользователи друзья
- 2 - заявка была отклонена
Прошу помощи... как сделать правильно, красиво и производительно?
Структура таблиц:Users CREATE TABLE `users` (
`id` int(11) NOT NULL,
`group_id` smallint(2) NOT NULL DEFAULT '4',
`email` varchar(50) NOT NULL,
`login` varchar(64) NOT NULL,
`name` varchar(32) NOT NULL,
`sex` tinyint(1) DEFAULT NULL,
`bdate` date DEFAULT NULL,
`country_id` int(11) DEFAULT NULL,
`state_id` int(11) DEFAULT NULL,
`city_id` int(11) DEFAULT NULL,
`pwd` varchar(64) DEFAULT NULL,
`salt` varchar(100) DEFAULT NULL,
`reg_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`last_visited` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`foto` varchar(32) DEFAULT NULL,
`provider` enum('native','vk','ok','go','fb','tw') DEFAULT 'native',
`social_id` bigint(32) DEFAULT NULL,
`link_fb` varchar(40) DEFAULT NULL,
`link_in` varchar(40) DEFAULT NULL,
`link_tw` varchar(40) DEFAULT NULL,
`link_yo` varchar(40) DEFAULT NULL,
`rating` float DEFAULT NULL,
`albums` int(11) DEFAULT NULL,
`timezone` varchar(255) DEFAULT NULL,
`is_banned` tinyint(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
ALTER TABLE `users`
ADD PRIMARY KEY (`id`),
ADD KEY `login` (`login`) USING BTREE,
ADD KEY `username` (`name`(5));
Friends:
--
-- Структура таблицы `friends`
--
CREATE TABLE `friends` (
`id` int(11) NOT NULL,
`user_one` int(11) NOT NULL,
`user_two` int(11) NOT NULL,
`status` int(1) NOT NULL,
`accept` tinyint(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Индексы таблицы `friends`
--
ALTER TABLE `friends`
ADD PRIMARY KEY (`id`),
ADD KEY `user_one` (`user_one`),
ADD KEY `user_two` (`user_two`);