Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2018, 20:40   #1
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию Оптимизация запроса sql

Добрый день. Возник один вопрос.

Есть два запроса с одной таблицы.

Код:
1 SELECT ip, COUNT(ip) FROM logs_data GROUP BY ip ORDER by count(ip) DESC
2 SELECT ip, COUNT(code) FROM logs_data WHERE code = '404' GROUP BY ip ORDER by COUNT(code) DESC
Надо бы их объединить, чтобы было следующий формат ip COUNT(ip) COUNT(code)

Написал такой запрос, он это делает.

Код:
SELECT a.ip_addres, a.ip_count, COUNT(logs_data.code) FROM 
(SELECT ip as ip_addres, COUNT(ip) as ip_count FROM logs_data GROUP BY ip) as a INNER JOIN logs_data on a.ip_addres = logs_data.ip
WHERE logs_data.code = '404' GROUP BY a.ip_addres ORDER by COUNT(logs_data.code) DESC
Но он работает долго сильно, на 300к записей вообще зависает надолго.

Можно ли как то оптимизировать его, по шустрее заставить делать выборку?
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 17.01.2018, 20:55   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А так:
Код:
SELECT ip, COUNT(ip),SUM(CASE WHEN code = '404' THEN 1 ELSE 0 END)
  FROM logs_data 
  GROUP BY ip 
  ORDER by 2 DESC
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.01.2018, 21:56   #3
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Мм, пасибо, интересная конструкция, не делал еще так.

SELECT ip, COUNT(ip),SUM(CASE WHEN code = '404' THEN 1 ELSE 0 END)
FROM logs_data
GROUP BY ip
ORDER by 2 DESC

Эмм, а можно вкрутце пояснить пару моментов для общего развития:
1 - ORDER by 2 DESC, двоечка за что отвечат
2- SUM(CASE WHEN code = '404' THEN 1 ELSE 0 END)

Пожалуйста))...
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 17.01.2018, 22:03   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

MYSQL ORDER BY CLAUSE в гугл, аналогично для кейса ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.01.2018, 22:07   #5
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

ORDER by 2 DESC поидее идет так, сортируем такое то поле от большего значения к меньшему. Но там 2, откуда она непонятно.
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 17.01.2018, 22:11   #6
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

А здесь выходит SUM(CASE WHEN code = '404' THEN 1 ELSE 0 END)
Просуммировал количество строк с выполняющимся данным условием. Либо если строк нету, суммировать то и нечего вернул 0, короче что то вернул если нет совпадений. Поясните с двойкой и все на этом)
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 17.01.2018, 22:17   #7
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

А епта, это второй параеметр, по COUNT(ip) сортируешь. Все со всем разобрался. Спасибо за помощь.
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 17.01.2018, 22:18   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Example - Sorting by relative position
You can also use the MySQL ORDER BY clause to sort by relative position in the result set, where the first field in the result set is 1. The next field is 2, and so on.

For example:
Код:
SELECT last_name, first_name, city
FROM contacts
WHERE last_name = 'Johnson'
ORDER BY 3 DESC;
Цитата:
This MySQL ORDER BY would return all records sorted by the city field in descending order, since the city field is in position #3 in the result set and would be equivalent to the following ORDER BY clause:
Код:
SELECT last_name, first_name, city
FROM contacts
WHERE last_name = 'Johnson'
ORDER BY city DESC;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация запроса sql Seregakz SQL, базы данных 8 21.02.2015 07:15
Оптимизация запроса russian-stalker SQL, базы данных 1 11.10.2011 13:17
оптимизация sql-запроса Vetra SQL, базы данных 0 20.07.2011 13:36
Оптимизация SQL запроса Phantom SQL, базы данных 4 24.09.2009 16:07
Оптимизация sql запроса в хп eda SQL, базы данных 3 28.07.2009 11:57