Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день.
Есть таблица вида:
id user_id name status
1 1 Ivan 1
2 2 Petr 1
3 3 Vasya 1
4 1 Ivan 100
5 4 Sasha 100
Как получить такой результат:
2 2 Petr 1
3 3 Vasya 1
4 1 Ivan 100
5 4 Sasha 100
Т.е. если у user_id есть строка со статусом 100 - оставить ее, и не выводить строку, где у него статус 1.
Дистинкт не работает, group by оставляет строку со статусом 1. Явно как-то должно это просто работать.
Заранее спасибо.
Неактивен
group все-таки работает, я не по тому полю группировал.
Неактивен
В результате получаю вот такой запрос:
Неактивен
А еще вдогонку пришло письмо от хостера, что этот запрос создает повышенную нагрузку на сервер.
Отображает строки 0 - 29 ( 82 всего, Запрос занял 0.0134 сек.)
Я вот думаю, одна сотая на выполнение запроса - это реально повышенная нагрузка? При том, что на страницу, где идет этот запрос заходят максимум 5-10 человек в час.
Неактивен
В вашем запросе без поллитры на обойтись
Если возвращаться к постановке вопроса из первого поста, то посмотрите статью http://sqlinfo.ru/articles/info/18.html
Вам подойдет первый способ с небольшими изменениями, если я правильно понял задачу.
Время, которое вы показываете - это время выполнения самого запроса или отдачи его из кеша?
Неактивен
Время, которое показываю - это то, что мне myadmin показывает. Из кеша это или сам запрос - не знаю как определить.
Но я тут поковырялся с explain и выяснил, что у меня там
3
DERIVED
mr
ALL
i_match_id
NULL
NULL
NULL
264
100.00
Using where; Using temporary; Using filesort
4
UNION
m
ALL
i_team1,i_team2
NULL
NULL
NULL
5849
100.0
Т.е. получается, что используются 264*5849 строк (1,5 млн!). 264 из верхней части запрос, а 5849 дает юнион (вторая часть).
Вопрос - почему оно дает 5849 строк, если там условие where стоит четкое абсолютно? (там реально не больше 100 строк выходит в результате)
Отредактированно Bust_Ed (26.03.2014 17:07:09)
Неактивен
Bust_Ed написал:
Время, которое показываю - это то, что мне myadmin показывает. Из кеша это или сам запрос - не знаю как определить.
select sql_no_cache ....
Bust_Ed написал:
Но я тут поковырялся с explain и выяснил, что у меня там
3
DERIVED
mr
ALL
i_match_id
NULL
NULL
NULL
264
100.00
Using where; Using temporary; Using filesort
4
UNION
m
ALL
i_team1,i_team2
NULL
NULL
NULL
5849
100.0
Т.е. получается, что используются 264*5849 строк (1,5 млн!). 264 из верхней части запрос, а 5849 дает юнион (вторая часть).
Вопрос - почему оно дает 5849 строк, если там условие where стоит четкое абсолютно? (там реально не больше 100 строк выходит в результате)
union это сложение, а не перемножение.
5849 - число строк, которые MySQL ожидает перебрать для выполнения данного запроса.
P.S. Почему вы не хотите переписать запрос в соответствии с рекомендацией из статьи? Он будет гораздо проще.
Неактивен
Статью сижу читаю, пожалуй, вы правы.
Переделаю завтра, на свежую голову.
Спасибо.
Неактивен
Так, вроде заработало.
При ближайшем рассмотрении, не работает. В статье используется довольно простая группировка. Вот она у меня как-то не так работает.
Отредактированно Bust_Ed (11.04.2014 13:40:38)
Неактивен
В общем, я ниче не хочу сказать, но группировка как написано в статье на сайте - не работает.
Вот так работает группировка:
SELECT mr1.*
FROM `match_raw` AS mr1
LEFT OUTER JOIN `match_raw` AS mr2
ON mr1.match_id = mr2.match_id AND mr1.dt_accept < mr2.dt_accept
WHERE mr2.match_id IS NULL
Неактивен