Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос / 9 сообщений из 9, страница 1 из 1
03.08.2014, 17:42:23
    #38711644
iOxYGeN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Здравствуйте форумчане!
Помогите оптимизировать запрос, буду очень признателен. Долго сильно выполняется =\

SELECT types_models.type_model_id,name_tmodel AS `Оборудование`,
(SELECT COUNT(*) FROM models WHERE models.type_model_id=types_models.type_model_id) AS `Всего`,
(SELECT COUNT(*) FROM models WHERE models.type_model_id=types_models.type_model_id AND (status_model=1 OR status_model=3)) AS `Выдано`,
(SELECT COUNT(*) FROM models WHERE models.type_model_id=types_models.type_model_id AND status_model=2) AS `На складе`
FROM models,types_models GROUP BY name_tmodel
...
Рейтинг: 0 / 0
03.08.2014, 17:51:07
    #38711652
Users
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
iOxYGeN,

А чего тут думать - конечно, долго будет выполняться, если три раза лопатить одну и ту же таблицу.
А переписывать - попробуйте самостоятельно.

Подсказка:

count(case when models.type_model_id=types_models.type_model_id then 1 else o end) Total
...
Рейтинг: 0 / 0
03.08.2014, 18:06:34
    #38711653
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
UsersiOxYGeN,

А чего тут думать - конечно, долго будет выполняться, если три раза лопатить одну и ту же таблицу.
А переписывать - попробуйте самостоятельно.

Подсказка:

count(case when models.type_model_id=types_models.type_model_id then 1 else o end) Total


вообшето
SUM(case when models.type_model_id=types_models.type_model_id then 1 else o end)

но это мелочи...

iOxYGeN, расскажите что вы хотите и как связаны модели и типы моделей.
Как есть -- у вас полное перемножение моделей и типов --
в WHERE не связки.
...
Рейтинг: 0 / 0
03.08.2014, 18:49:37
    #38711668
iOxYGeN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Есть таблица models где находятся все зарегистрированные модели, в ней есть поле type_model_id , которое является внешним ключом к полю type_model_id в таблице type_models . Поле status_model указывает на местонахождение модели (1-Выдано, 2-На складе, 3-В ремонте). В поле Выдано нужно учитывать статус 1 и 3 (выдана и если нах-ся в ремонте)
Хотелось бы вывести такую информацию(см. приложение):

Обор-иеВсегоВыданоНа складеБатарея 16 2 14HDD 11 0 11Клавиатура1019
...
Рейтинг: 0 / 0
03.08.2014, 19:10:11
    #38711681
iOxYGeN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Получилось составить по подсказке Users. Выполняется быстрее.
Поясните пожалуйста что значит case when 1 else 0 end
Вот полученный вариант:
SELECT name_tmodel AS `Оборудование`,
SUM(case when models.type_model_id=types_models.type_model_id then 1 else 0 end) `Всего`,
SUM(case when models.type_model_id=types_models.type_model_id AND (status_model=1 OR status_model=3) then 1 else 0 end) `Выдано`,
SUM(case when models.type_model_id=types_models.type_model_id AND status_model=2 then 1 else 0 end) `На складе`
FROM models, types_models
GROUP BY name_tmodel

Правильно сконструировал?
...
Рейтинг: 0 / 0
03.08.2014, 19:33:18
    #38711691
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
iOxYGeNПолучилось составить по подсказке Users. Выполняется быстрее.
Поясните пожалуйста что значит case when 1 else 0 end
Вот полученный вариант:
SELECT name_tmodel AS `Оборудование`,
SUM(case when models.type_model_id=types_models.type_model_id then 1 else 0 end) `Всего`,
SUM(case when models.type_model_id=types_models.type_model_id AND (status_model=1 OR status_model=3) then 1 else 0 end) `Выдано`,
SUM(case when models.type_model_id=types_models.type_model_id AND status_model=2 then 1 else 0 end) `На складе`
FROM models, types_models
GROUP BY name_tmodel

Правильно сконструировал?


ну скорее так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT t.name_tmodel AS `Оборудование`,
  COUNT(1) `Всего`,
  SUM(m.status_model in (1,3)) `Выдано`,
  SUM(m.status_model = 2) `На складе`
FROM models m, types_models t
WHERE m.type_model_id = t.type_model_id
GROUP BY t.name_tmodel



Возможно , есть варианты ускорить, но это уже
следуюший вопрос.
...
Рейтинг: 0 / 0
03.08.2014, 19:50:19
    #38711698
Users
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
iOxYGeN,

Имеет смысл почитать доку по Case. Вообще хорошая команда, нужная. ;)
Но предложенный javajdbc вариант - лучше. Я бы из него убрал группировку по name_tmodel, оставил по model_id - и потом приджойнил бы. Текстовое поле в группировке не есть рулез.

Плюс проверить, что индексы есть на поле type_model_id в обеих таблицах.

Если прямо выжать всё - то можно не делать SUM(m.status_model = 2) `На складе`, а просто вычесть из "всего" - "выдано".
...
Рейтинг: 0 / 0
03.08.2014, 19:51:22
    #38711699
Users
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
При этом учитывать, что если появится еще один status_model, скажем, 4 - то код придется переписать.
...
Рейтинг: 0 / 0
03.08.2014, 19:55:52
    #38711702
iOxYGeN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
SUM(m.status_model in (1,3))
(1,3) это если Or, а если нужно будет AND? как будет конструкция выглядеть?
Огромной спасибо, ребята.
Посоветуете какие нибудь книжки хорошие mssql/mysql? Чувствую себя нубом нубским :)
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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