Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Запрос

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
biperch
Отправлено: 02 Декабря, 2013 - 13:49:26
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 588
Дата рег-ции: Окт. 2009  
Откуда: Днепропетровск


Помог: 8 раз(а)




Задача
Нужно выбрать пользователей которые не имеют роли с номерами 3, 30,29
У одного пользователя может быть несколько ролей

Решил эту задачу вот так:
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT
  3.           DISTINCT u.uid,
  4.           u.mail,
  5.           pv1.value AS profile_last_name
  6. FROM users u
  7. LEFT JOIN profile_values pv1 ON pv1.uid = u.uid AND pv1.fid = 27
  8. WHERE
  9.           u.STATUS = 1 AND
  10.           u.uid NOT IN (SELECT DISTINCT uid FROM users_roles WHERE rid IN (29, 3, 30) )
  11.  


выполнил explain
есть ли какой то вариант решения этой задачи, поскольку NOT IN в таком случае не использует индексы
Прикреплено изображение (Нажмите для увеличения)
Снимок экрана - 02.12.2013 - 13:47:46.png

(Отредактировано автором: 02 Декабря, 2013 - 13:51:06)

 
 Top
Мелкий Супермодератор
Отправлено: 02 Декабря, 2013 - 14:03:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2.  u.uid,
  3.           u.mail
  4.  
  5. FROM users u
  6. LEFT JOIN users_roles ur ON rid IN (29, 3, 30) AND u.uid=ur.uid
  7. WHERE
  8.           u.STATUS = 1 AND ur.uid IS NULL

?

Т.е. делаем left join с этими ролями и отсекаем те, для кого нашлись совпадения.


-----
PostgreSQL DBA
 
 Top
biperch
Отправлено: 02 Декабря, 2013 - 15:06:24
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 588
Дата рег-ции: Окт. 2009  
Откуда: Днепропетровск


Помог: 8 раз(а)




по проходам тоже самое но но индексам есть изменения...
Прикреплено изображение (Нажмите для увеличения)
Снимок экрана - 02.12.2013 - 15:05:37.png
 
 Top
Мелкий Супермодератор
Отправлено: 02 Декабря, 2013 - 15:36:05
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




biperch пишет:
поскольку NOT IN в таком случае не использует индексы

А с чего вы это, собственно, взяли? На месте индексы.


-----
PostgreSQL DBA
 
 Top
biperch
Отправлено: 02 Декабря, 2013 - 15:42:39
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 588
Дата рег-ции: Окт. 2009  
Откуда: Днепропетровск


Помог: 8 раз(а)




при условиях с NOT или <> индексы не используются
http://www[dot]slideshare[dot]net/interl[dot][dot][dot]13mysql-21660750
(Добавление)
но не всегда правильно оптимизируется
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB