|
|
|
Помогите понять где косяк в запросе
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Есть таблица `Items` с некими предметами внутри и PRIMARY KEY `id`. А так же 2 дополнительной таблицы, с сопутствующей предметам инфой. Обе эти таблицы содержат в себе столбец `item_id`, в котором хранятся значение `id` того или иного предмета из таблицы `Items`. Задача запроса представленного ниже состоит в том, чтобы сделать выборку n-ного числа предметов из `Items`, при этом получая кол-во вхождений данного предмета из первой и второй дополнительной таблиц. Код: sql 1. 2. 3. 4. 5. Косяк в том, что при таком запросе `num_1` содержит правильное значение, а `num_2` всегда равно `num_1` (т.е. не корректно). Почему так получается и как это побороть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2013, 16:55:30 |
|
||
|
Помогите понять где косяк в запросе
|
|||
|---|---|---|---|
|
#18+
посчитать сначала агрегаты отдельно по подчиненным таблицам, после - результат в виде деривед-тэйбла приджойнить к главной таблице ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2013, 17:03:10 |
|
||
|
Помогите понять где косяк в запросе
|
|||
|---|---|---|---|
|
#18+
Так то оно так... А без вложенных запросов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2013, 17:07:21 |
|
||
|
Помогите понять где косяк в запросе
|
|||
|---|---|---|---|
|
#18+
Климов ДмитрийТак то оно так... А без вложенных запросов? попробуйте: .... COUNT(distinct `et_1`.`id`) AS `num_1`, COUNT(distinct `et_2`.`id`) AS `num_2` ..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2013, 17:41:05 |
|
||
|
Помогите понять где косяк в запросе
|
|||
|---|---|---|---|
|
#18+
javajdbc, работает o_0 Но меня этот ставит в ступор... Если в `et_1` и `et_2` столбцы `id` - это PRIMARY KEY, их значения и так не могут быть неуникальными, как DISTINCT смог помочь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2013, 17:57:11 |
|
||
|
Помогите понять где косяк в запросе
|
|||
|---|---|---|---|
|
#18+
Климов Дмитрийjavajdbc, работает o_0 Но меня этот ставит в ступор... Если в `et_1` и `et_2` столбцы `id` - это PRIMARY KEY, их значения и так не могут быть неуникальными, как DISTINCT смог помочь?А вы уберите GROUP BY и в секции SELECT все поля замените на одну звездочку. Так вы увидите промежуточный результат перед GROUP BY-ем и увидите, что там множатся записи по причине того, что одной записи в таблице А могут соответствовать несколько записей в таблице Б. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2013, 18:00:07 |
|
||
|
Помогите понять где косяк в запросе
|
|||
|---|---|---|---|
|
#18+
Климов Дмитрий, у вас образовался неявный CROSS JOIN между et_1 и et_2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2013, 19:38:45 |
|
||
|
Помогите понять где косяк в запросе
|
|||
|---|---|---|---|
|
#18+
Климов Дмитрийработает o_0работать-то работает, но смысл сначала размножить записи, чтобы после считать агрегаты с дистинктом? Или серверу больше заняться нечем, как агрегировать избыточно-раздутые объемы данных? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2013, 22:07:09 |
|
||
|
Помогите понять где косяк в запросе
|
|||
|---|---|---|---|
|
#18+
Добрый Э - ЭхКлимов Дмитрийработает o_0работать-то работает, но смысл сначала размножить записи, чтобы после считать агрегаты с дистинктом? Или серверу больше заняться нечем, как агрегировать избыточно-раздутые объемы данных? Я бы согласился, если будет доказано что идет очень сильное размножение и развод кроликов, но мы же не знаем конкретные кординалити обоих таблиц. без размножения подойдет ин-лайн кореллированые подселекты в СЕЛЕКТ групе. наверно это самый быстрый способ. кстати о кроликах -- ваше предложение [14743228] про пре-агрегирование и подсоединение с большой вероятностью окажется на несколько порядков медленее... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2013, 23:25:46 |
|
||
|
Помогите понять где косяк в запросе
|
|||
|---|---|---|---|
|
#18+
javajdbcс большой вероятностью окажется на несколько порядков медленееОно окажется медленнее, если в агрегатных таблицах будет "много" записей (у меня это "много" обычно начинается где-то с 5к+ записей). Причём насколько я понимаю, это чисто мусклевская антифича - ну не умеет он свои временные таблицы джойнить по-человечески. Единственный выход- их индексирование, но индексировать можно только вручную созданные времтаблицы. А вот результаты подзапросов - увы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2013, 05:55:31 |
|
||
|
Помогите понять где косяк в запросе
|
|||
|---|---|---|---|
|
#18+
Инфы много, буду вникать. Спасибо всем кто ответил! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2013, 10:16:57 |
|
||
|
Помогите понять где косяк в запросе
|
|||
|---|---|---|---|
|
#18+
tanglir, угу. Чисто его... :( поэтому приходится каждый раз "гадать на объеме данных", что будет быстрее: размножить и агрегировать или делать подселект и выделять нужное или делать времянку и её индексировать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2013, 10:44:34 |
|
||
|
Помогите понять где косяк в запросе
|
|||
|---|---|---|---|
|
#18+
tanglirjavajdbcс большой вероятностью окажется на несколько порядков медленееОно окажется медленнее, если в агрегатных таблицах будет "много" записей (у меня это "много" обычно начинается где-то с 5к+ записей). Причём насколько я понимаю, это чисто мусклевская антифича - ну не умеет он свои временные таблицы джойнить по-человечески. Единственный выход- их индексирование, но индексировать можно только вручную созданные времтаблицы. А вот результаты подзапросов - увы... да, имено про то и есть разговор. Есть как минимум 2 способа избежать равода кроликов и не делать двойную работу преагрегат-связка: Код: sql 1. 2. 3. 4. 5. или Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2013, 16:55:13 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=212&tid=1836192]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
24ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 313ms |

| 0 / 0 |
