|
Как правильно изменить запрос?
|
|||
---|---|---|---|
#18+
Обнаружилось, что следующий запрос (минимальная часть из более комплексного, на котором воспроизводится ошибка): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
правильно подсчитывает dolg, dolg_count, ord_in_mkd, ord_sum только в том случае , когда на одного id_contragent приходится одна запись за период выборки в таблице orders o . Если же записей несколько, то dolg, dolg_count увеличивается на их количество, что неправильно (с моей точки зрения, но не SQL :)). Если убрать агрегатные функции и группировку из запроса, добавив id_contragent для наглядности: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
то в результате запроса это дублирование видно (см. фрагмент скриншота ниже). Собственно вопрос: как правильно подсчитать ord_in_mkd, ord_sum (словами: кол-во приказов, выданных на должника за период на общую сумму), чтобы не изменить dolg, dolg_count (словами: общий долг и кол-во должников за период)? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2019, 12:07 |
|
Как правильно изменить запрос?
|
|||
---|---|---|---|
#18+
Навскидку так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2019, 13:10 |
|
Как правильно изменить запрос?
|
|||
---|---|---|---|
#18+
Akina, спасибо, должно сработать! Попробую уже в понедельник, т.к. убежал с работы, отпишусь... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2019, 13:53 |
|
Как правильно изменить запрос?
|
|||
---|---|---|---|
#18+
На самом деле меня как-то смущает вот эта последовательность: Код: sql 1. 2.
И закрадывается подозрение, что GROUP BY тут - что в запросе, что в подзапросе, - нафиг не нужны от слова "совсем". ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2019, 15:25 |
|
Как правильно изменить запрос?
|
|||
---|---|---|---|
#18+
Akina, В реальном запросе группировка по МКД нужна, AND m.id=47 вставил в WHERE только для теста (отбор по одному МКД, искал причину увеличения dolg, dolg_count). ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2019, 11:11 |
|
Как правильно изменить запрос?
|
|||
---|---|---|---|
#18+
LiYing, У тебя m.id задаётся в запросе как параметр и тут же по нему идёт группировка . Какой в этом смысл? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 14:02 |
|
Как правильно изменить запрос?
|
|||
---|---|---|---|
#18+
LiYing, в первом запросе GROUP BY неверный, в выражениии CONCAT(name,", ",addr_building,IF(addr_letter is null, "", CONCAT("/",addr_letter))) adr, полно полей, не входящих в GROUP BY. Они все должны быть там. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 14:03 |
|
Как правильно изменить запрос?
|
|||
---|---|---|---|
#18+
LiYing Akina, В реальном запросе группировка по МКД нужна, AND m.id=47 вставил в WHERE только для теста (отбор по одному МКД, искал причину увеличения dolg, dolg_count). Так-то всё на уровне "рыба не смогла..." ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 14:04 |
|
Как правильно изменить запрос?
|
|||
---|---|---|---|
#18+
MasterZiv LiYing, У тебя m.id задаётся в запросе как параметр и тут же по нему идёт группировка . Какой в этом смысл? Ответ был дан в предыдущем от цитируемого посте. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 14:18 |
|
Как правильно изменить запрос?
|
|||
---|---|---|---|
#18+
Akina Навскидку так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Убрал опечатку в 3-й строке: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Но не подсчитываются данные в строках: Код: sql 1. 2.
всегда 0 и null. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 14:24 |
|
Как правильно изменить запрос?
|
|||
---|---|---|---|
#18+
LiYing всегда 0 и null. Хотя, если убрать агрегатные функции и группировку из запроса, видно, что данные из orders присоединяются. Почему ж тогда не суммируются? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 14:57 |
|
Как правильно изменить запрос?
|
|||
---|---|---|---|
#18+
ну добавь эти поля o.id_contragent и o.debt_sum в запрос без группировки и посмотри что там у тебя ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 15:06 |
|
Как правильно изменить запрос?
|
|||
---|---|---|---|
#18+
Alex_Ustinov ну добавь эти поля o.id_contragent и o.debt_sum в запрос без группировки и посмотри что там у тебя Все null. Но, кажется, я понял почему так. В подзапросе Акины данные сгруппированы по id_mkd, а внешняя группировка идет по id_contragent данные джойнятся по id_contragent (которые уже свернуты в группировке) и они никак не стыкуются. Осталось понять, как это побороть :) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 15:27 |
|
Как правильно изменить запрос?
|
|||
---|---|---|---|
#18+
Ну тогда остаётся одно. Делаешь подзапрос с текстом исходного запроса. Делаешь второй подзапрос, в котором нет таблицы orders. И джойнишь их, беря ord_sum из первого подзапроса, а всё остальное из второго. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 15:58 |
|
Как правильно изменить запрос?
|
|||
---|---|---|---|
#18+
Akina, не поможете это сделать, как сие записать? Ум за разум уже заходит от попытки представить такую конструкцию, query конструктор постоянно ругается %) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 16:25 |
|
Как правильно изменить запрос?
|
|||
---|---|---|---|
#18+
Akina, С утра нашло озарение Составил таки рабочий запрос: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
Правильно я понял Вашу мысль? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2019, 09:19 |
|
Как правильно изменить запрос?
|
|||
---|---|---|---|
#18+
LiYing Правильно я понял Вашу мысль? В тексте запроса не все поля имеют алиасы таблиц, но, судя по именам полей типа addr_?????, они из таблицы streets, так что лишних таблиц нет, всё ровно. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2019, 10:05 |
|
Как правильно изменить запрос?
|
|||
---|---|---|---|
#18+
Akina В тексте запроса не все поля имеют алиасы таблиц, но, судя по именам полей типа addr_?????, они из таблицы streets, так что лишних таблиц нет, всё ровно. Не совсем так, но, думаю, это не важно. С алиасами так: Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2019, 10:19 |
|
Как правильно изменить запрос?
|
|||
---|---|---|---|
#18+
Akina, А если к q1 надо еще пару выборок из других таблиц приджойнить, то делаем аналогично? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51.
Ничего нельзя упростить? Такой чудовищный explain выходит: ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2019, 10:48 |
|
Как правильно изменить запрос?
|
|||
---|---|---|---|
#18+
LiYing А если к q1 надо еще пару выборок из других таблиц приджойнить, то делаем аналогично? LiYing Ничего нельзя упростить? LiYing Такой чудовищный explain выходит: Код: sql 1. 2. 3.
в CTE для ре-юза. Если он достаточно компактный, даже потеря доступа к индексам не будет влиять на производительность. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2019, 11:03 |
|
|
start [/forum/topic.php?fid=47&msg=39903866&tid=1828813]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
156ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 338ms |
total: | 594ms |
0 / 0 |