|
|
|
Помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Здравствуйте форумчане! Помогите оптимизировать запрос, буду очень признателен. Долго сильно выполняется =\ 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 17:42:23 |
|
||
|
Помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
iOxYGeN, А чего тут думать - конечно, долго будет выполняться, если три раза лопатить одну и ту же таблицу. А переписывать - попробуйте самостоятельно. Подсказка: count(case when models.type_model_id=types_models.type_model_id then 1 else o end) Total ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 17:51:07 |
|
||
|
Помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
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 не связки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 18:06:34 |
|
||
|
Помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Есть таблица models где находятся все зарегистрированные модели, в ней есть поле type_model_id , которое является внешним ключом к полю type_model_id в таблице type_models . Поле status_model указывает на местонахождение модели (1-Выдано, 2-На складе, 3-В ремонте). В поле Выдано нужно учитывать статус 1 и 3 (выдана и если нах-ся в ремонте) Хотелось бы вывести такую информацию(см. приложение): Обор-иеВсегоВыданоНа складеБатарея 16 2 14HDD 11 0 11Клавиатура1019 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 18:49:37 |
|
||
|
Помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Получилось составить по подсказке 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 Правильно сконструировал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 19:10:11 |
|
||
|
Помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
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. Возможно , есть варианты ускорить, но это уже следуюший вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 19:33:18 |
|
||
|
Помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
iOxYGeN, Имеет смысл почитать доку по Case. Вообще хорошая команда, нужная. ;) Но предложенный javajdbc вариант - лучше. Я бы из него убрал группировку по name_tmodel, оставил по model_id - и потом приджойнил бы. Текстовое поле в группировке не есть рулез. Плюс проверить, что индексы есть на поле type_model_id в обеих таблицах. Если прямо выжать всё - то можно не делать SUM(m.status_model = 2) `На складе`, а просто вычесть из "всего" - "выдано". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 19:50:19 |
|
||
|
Помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
При этом учитывать, что если появится еще один status_model, скажем, 4 - то код придется переписать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 19:51:22 |
|
||
|
Помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
SUM(m.status_model in (1,3)) (1,3) это если Or, а если нужно будет AND? как будет конструкция выглядеть? Огромной спасибо, ребята. Посоветуете какие нибудь книжки хорошие mssql/mysql? Чувствую себя нубом нубским :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 19:55:52 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38711653&tid=1834415]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
54ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 243ms |
| total: | 391ms |

| 0 / 0 |
