powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация сложного запроса
6 сообщений из 6, страница 1 из 1
Оптимизация сложного запроса
    #38842697
AKB2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, Уважаемы Форумчане. Я на сайте использую для пользователей некоторое голосование, друг за друга. Суть запроса выбрать из базы данных 2 пользователей за которых текущий еще не голосовал.

поля:
`user` - таблица с информацией о пользователях
`user_rate` - результаты голосования
`user_rate`.`sender_id` - здесь ID голосуещего
`user_rate`.`page_id` - здесь ID за кого голосуют
`user_rate`.`cool_to` - здесь ID второго оппонента

Если в таблице `user_rate` в поле `sender_id` равным 'id_текущего_пользователя' мало записей, то запрос выполняется с приемлемой скоростью, но с увлечением количества записей, увеличивается и скорость выполнения, замеченный мною максимум составляет 6 секунд!! O_O

Результат такого запроса - это два поля с записями двух ID

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SELECT
	`t1`.`id` AS `id1`,
	`t2`.`id` AS `id2`
FROM `user` AS `t1`,`user` AS `t2`
WHERE
	`t2`.`id`!=`t1`.`id` AND
	`t1`.`id`!='id_текущего_пользователя' AND
	`t2`.`id`!='id_текущего_пользователя' AND
	(
		SELECT COUNT(*)
		FROM `user_rate`
		WHERE
			(
				`user_rate`.`sender_id`='id_текущего_пользователя' AND
				`user_rate`.`cool_to`=`t2`.`id` AND
				`user_rate`.`page_id`=`t1`.`id`
			)OR(
				`user_rate`.`sender_id`='id_текущего_пользователя' AND
				`user_rate`.`page_id`=`t2`.`id` AND
				`user_rate`.`cool_to`=`t1`.`id`
			)
	)=""
LIMIT 1
...
Рейтинг: 0 / 0
Оптимизация сложного запроса
    #38842713
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что значит "второй оппонент"?
...
Рейтинг: 0 / 0
Оптимизация сложного запроса
    #38842717
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чего-то вы наворотили... если вся задача в том, чтобы
AKB2выбрать из базы данных 2 пользователей за которых текущий еще не голосовал., и
AKB2`user_rate`.`sender_id` - здесь ID голосуещего
`user_rate`.`page_id` - здесь ID за кого голосуют, то это решается вот так
Код: sql
1.
2.
3.
4.
5.
6.
7.
select * 
from users 
where id not in (select distinct page_id
 from user_rate
 where sender_id=:current_user_id
)
order by чего-нибудь limit 2


если версия ниже 5.6, то можно переписать на left join + is null
...
Рейтинг: 0 / 0
Оптимизация сложного запроса
    #38844156
AKB2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,

Я немного уточню, по полям в таблице `user_rate`

id - идентификатор записи (auto_increment)
sender_id - ID того кто голосует
page_id - ID пользователя за которого голосующий (sender_id) проголосовал
cool_to - ID пользователя с кем сравнивали первого (page_id)

В общем Вы авторизуетесь на странице и на спец. странице Вам предлагают выбрать кто из двух других пользователей, которые должны выбираться рандомно, круче. И вы выбираете, голос учитывается и за того, за кого проголосовали получает +1 к рейтингу, второй ничего.
...
Рейтинг: 0 / 0
Оптимизация сложного запроса
    #38844180
AKB2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,
Спасибо большое, Ваш ответ помог скорость выполнения упала до 0,0021, но только немного пришлось исправить код.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT
	`id`
FROM `user`
WHERE
	`id`!='ID текущего пользователя' AND
	`id` NOT IN(
		SELECT
			DISTINCT LEAST(`page_id`,`cool_to`)
		FROM `user_rate`
		WHERE
			`sender_id`='ID текущего пользователя'
	)
LIMIT 2
...
Рейтинг: 0 / 0
Оптимизация сложного запроса
    #38844351
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если версия ниже 5.6, то попробуйте ещё так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT
	`user`.`id`
FROM `user`
LEFT JOIN (
		SELECT
			DISTINCT LEAST(`page_id`,`cool_to`) id
		FROM `user_rate`
		WHERE
			`sender_id`='ID текущего пользователя'
 
) t0 on `user`.id=t0.id
WHERE
	`user`.`id`!='ID текущего пользователя'
	and t0.id is null
LIMIT 2

как правило такое быстрее, но в этом случае у меня есть сомнения
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация сложного запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]