SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 17.01.2012 11:30:36

forlord
Участник
Зарегистрирован: 11.08.2011
Сообщений: 16

Нужна помощь с выборкой

Есть запрос, который выбирает всех друзей пользователя, нужно чтоб именники стояли впереди

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 строк
Как быть?

Неактивен

 

#2 18.01.2012 00:30:48

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Нужна помощь с выборкой

То есть JOIN по CASE Вас не смущает, а сортировка — смущает? smile
Сделайте табличку с двунаправленными друзьями — избавитесь от кучи
мусора в запросе. Что касается сортировки — можно, например, схитрить:
SELECT ...
WHERE birthday >= CURDATE() ORDER BY birthday
UNION
SELECT ... WHERE birthday < CURDATE();

Неактивен

 

#3 18.01.2012 23:30:09

forlord
Участник
Зарегистрирован: 11.08.2011
Сообщений: 16

Re: Нужна помощь с выборкой

можно по подробнее оба варианта

Неактивен

 

#4 22.01.2012 19:48:01

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Нужна помощь с выборкой

Тут есть только один вариант, и он описан smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson