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 :: Вывести разделы, на которые подписаны пользователи
Покинул форум
Сообщений всего: 77
Дата рег-ции: Июль 2011
Помог: 0 раз(а)
Этот запрос выведет только записи, в которых category_id = 1
А мне нужно именно остальные записи тех user_id в которых присутствует category_id = 1
Не совсем наверное я правильно перефразировал, поэтому, лучше наверное в первом посте объяснил
Т.е. мне нужны именно эти записи:
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
Да. Вы правы, я неверно понял задачу.
Тогда предлагаю вместо того, что бы в запросе выполнять подзапрос, выберите отдельным запросом айдишки тех пользователей которые Вам нужны, потом сделайте из полученного массива строку, которая будет содержать айдишки пользователей через запятую и подставьте в IN.
Покинул форум
Сообщений всего: 77
Дата рег-ции: Июль 2011
Помог: 0 раз(а)
Попробую, но мне кажется скорость от этого не сильно изменится...
teddy
Отправлено: 19 Сентября, 2014 - 00:15:41
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
Про отдельную выборку id это я к тому, что использование подзапросов в IN лишает СУБД возможности использовать индексы. Поэтому при большом количестве данных обычно вешается индекс на поле, которое используется как IN, а в скобки IN передается уже заранее известные значения.
Вообще странно такое поведение. По сути 100к записей это фигня.
Стало интересно, создал таблицу по Вашим данным на своей задрыпанной машине, и Ваш запрос выполнился у меня за 1 секунду.
Уверены, что проблема в запросе?
Sail
Отправлено: 19 Сентября, 2014 - 08:20:14
Участник
Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
teddy пишет:
использование подзапросов в IN лишает СУБД возможности использовать индексы.
Не лишает.
Но у MySQL, особенно если у вас древняя версия, этак до 5.5 - подзапросы работают большей частью отвратно. Оптимизатор неверно переписывает запрос.
Джойн на подзапрос (как показал Sail) или на самого себя такой проблемы не имеет и работает нормально.
Вариация Sail'а, но без подзапроса за ненадобностью:
SELECT t.`user_id`, t.`category_id`FROM`tablename`AS t JOIN`tablename`AS cat USING(`user_id`)WHERE cat.`category_id`='1'
Надо поиграться с explain'ом, но дополнительно ускорит индекс по category_id & user_id или user_id & category_id - не могу сообразить, какой именно оптимизатору понравится.
----- PostgreSQL DBA
Sail
Отправлено: 19 Сентября, 2014 - 09:49:48
Участник
Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014
Помог: 57 раз(а)
Мелкий пишет:
но без подзапроса за ненадобностью
Вот что меня смущало при отправке сообщения!
Ну и в довесок:
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
Мелкий пишет:
Не лишает.
Да, все верно. Я ошибся. Спасибо, что поправили.
Прошу прощения у автора за дезинформацию.
Помню где то читал, что MySQL не использует индексы в подзапросах, поверил на слово и даже не удосужился сделать EXPLAIN для проверки. Ну, сам дурак как говорится.. )
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.