Есть запрос, который выбирает всех друзей пользователя, нужно чтоб именники стояли впереди
SELECT
CASE
WHEN f.from_id = '1'
THEN f.to_id
WHEN f.to_id = '1'
THEN f.from_id
END AS id_friends, u.id AS id, u.nickname AS nickname, u.login AS login, u.is_deleted AS is_deleted, u.status, p.imageurl AS avatar, u.logdate AS flogdate, o.id AS online
FROM user_friends f
INNER JOIN cms_users u ON u.id =
CASE WHEN f.from_id = '1'
THEN f.to_id
WHEN f.to_id = '1'
THEN f.from_id
END
INNER JOIN user_profiles p ON p.user_id = u.id
LEFT JOIN online o ON p.user_id = o.user_id
WHERE (
f.from_id = '1'
OR f.to_id = '1'
)
AND f.is_accepted =1
ORDER BY DATE_FORMAT( u.birthdate, '%d-%m' ) = '04-01' DESC
LIMIT 30
Запрос работает правильно но сильно пугает explain
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE f ref select,to_id,from_id,is_accepted select 4 const 4046 Using where; Using index; Using temporary; Using f...
1 SIMPLE p ref user_id user_id 4 func 1 Using where
1 SIMPLE o ref user_id user_id 4 p.user_id 2
1 SIMPLE u eq_ref PRIMARY,id PRIMARY 4 func 1 Using where
CREATE TABLE IF NOT EXISTS `user_friends` (
`id` int(11) NOT NULL auto_increment,
`to_id` int(11) NOT NULL,
`from_id` int(11) NOT NULL,
`logdate` datetime NOT NULL,
`is_accepted` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `select` (`is_accepted`,`from_id`,`to_id`),
KEY `to_id` (`to_id`),
KEY `from_id` (`from_id`),
KEY `is_accepted` (`is_accepted`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=8750 ;
В базе порядка 8000 строк
Как быть?