Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите понять где косяк в запросе / 14 сообщений из 14, страница 1 из 1
22.08.2013, 16:55:30
    #38375008
Помогите понять где косяк в запросе
Здравствуйте!

Есть таблица `Items` с некими предметами внутри и PRIMARY KEY `id`.

А так же 2 дополнительной таблицы, с сопутствующей предметам инфой. Обе эти таблицы содержат в себе столбец `item_id`, в котором хранятся значение `id` того или иного предмета из таблицы `Items`.

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

Код: sql
1.
2.
3.
4.
5.
SELECT `i`.`id`, `i`.`name`, COUNT(`et_1`.`id`) AS `num_1`, COUNT(`et_2`.`id`) AS `num_2`
FROM `Items` AS `i` LEFT JOIN `external_table_1` AS `et_1` ON `i`.`id` = `et_1`.`item_id`
  LEFT JOIN `external_table_2` AS `et_2` ON `i`.`id` = `et_2`.`item_id`
WHERE `i`.`id` IN (1,2,3,4,5)
GROUP BY `i`.`id`



Косяк в том, что при таком запросе `num_1` содержит правильное значение, а `num_2` всегда равно `num_1` (т.е. не корректно).

Почему так получается и как это побороть?
...
Рейтинг: 0 / 0
22.08.2013, 17:03:10
    #38375025
Помогите понять где косяк в запросе
посчитать сначала агрегаты отдельно по подчиненным таблицам, после - результат в виде деривед-тэйбла приджойнить к главной таблице
...
Рейтинг: 0 / 0
22.08.2013, 17:07:21
    #38375039
Помогите понять где косяк в запросе
Так то оно так... А без вложенных запросов?
...
Рейтинг: 0 / 0
22.08.2013, 17:41:05
    #38375104
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять где косяк в запросе
Климов ДмитрийТак то оно так... А без вложенных запросов?

попробуйте:
....
COUNT(distinct `et_1`.`id`) AS `num_1`,
COUNT(distinct `et_2`.`id`) AS `num_2`
.....
...
Рейтинг: 0 / 0
22.08.2013, 17:57:11
    #38375138
Помогите понять где косяк в запросе
javajdbc, работает o_0

Но меня этот ставит в ступор...

Если в `et_1` и `et_2` столбцы `id` - это PRIMARY KEY, их значения и так не могут быть неуникальными, как DISTINCT смог помочь?
...
Рейтинг: 0 / 0
22.08.2013, 18:00:07
    #38375149
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять где косяк в запросе
Климов Дмитрийjavajdbc, работает o_0

Но меня этот ставит в ступор...

Если в `et_1` и `et_2` столбцы `id` - это PRIMARY KEY, их значения и так не могут быть неуникальными, как DISTINCT смог помочь?А вы уберите GROUP BY и в секции SELECT все поля замените на одну звездочку. Так вы увидите промежуточный результат перед GROUP BY-ем и увидите, что там множатся записи по причине того, что одной записи в таблице А могут соответствовать несколько записей в таблице Б.
...
Рейтинг: 0 / 0
22.08.2013, 19:38:45
    #38375216
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять где косяк в запросе
Климов Дмитрий,

у вас образовался неявный CROSS JOIN между et_1 и et_2
...
Рейтинг: 0 / 0
22.08.2013, 22:07:09
    #38375311
Помогите понять где косяк в запросе
Климов Дмитрийработает o_0работать-то работает, но смысл сначала размножить записи, чтобы после считать агрегаты с дистинктом? Или серверу больше заняться нечем, как агрегировать избыточно-раздутые объемы данных?
...
Рейтинг: 0 / 0
22.08.2013, 23:25:46
    #38375338
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять где косяк в запросе
Добрый Э - ЭхКлимов Дмитрийработает o_0работать-то работает, но смысл сначала размножить записи, чтобы после считать агрегаты с дистинктом? Или серверу больше заняться нечем, как агрегировать избыточно-раздутые объемы данных?

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

без размножения подойдет ин-лайн
кореллированые подселекты в
СЕЛЕКТ групе.
наверно это самый быстрый способ.

кстати о кроликах -- ваше предложение [14743228] про
пре-агрегирование и подсоединение с большой вероятностью
окажется на несколько порядков медленее...
...
Рейтинг: 0 / 0
23.08.2013, 05:55:31
    #38375373
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять где косяк в запросе
javajdbcс большой вероятностью
окажется на несколько порядков медленееОно окажется медленнее, если в агрегатных таблицах будет "много" записей (у меня это "много" обычно начинается где-то с 5к+ записей).
Причём насколько я понимаю, это чисто мусклевская антифича - ну не умеет он свои временные таблицы джойнить по-человечески. Единственный выход- их индексирование, но индексировать можно только вручную созданные времтаблицы. А вот результаты подзапросов - увы...
...
Рейтинг: 0 / 0
23.08.2013, 10:16:57
    #38375497
Помогите понять где косяк в запросе
Инфы много, буду вникать.
Спасибо всем кто ответил!
...
Рейтинг: 0 / 0
23.08.2013, 10:44:34
    #38375528
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять где косяк в запросе
tanglir,

угу. Чисто его... :(

поэтому приходится каждый раз "гадать на объеме данных", что будет быстрее: размножить и агрегировать или делать подселект и выделять нужное или делать времянку и её индексировать...
...
Рейтинг: 0 / 0
23.08.2013, 16:55:13
    #38376128
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять где косяк в запросе
tanglirjavajdbcс большой вероятностью
окажется на несколько порядков медленееОно окажется медленнее, если в агрегатных таблицах будет "много" записей (у меня это "много" обычно начинается где-то с 5к+ записей).
Причём насколько я понимаю, это чисто мусклевская антифича - ну не умеет он свои временные таблицы джойнить по-человечески. Единственный выход- их индексирование, но индексировать можно только вручную созданные времтаблицы. А вот результаты подзапросов - увы...


да, имено про то и есть разговор. Есть как минимум 2
способа избежать равода кроликов и не делать
двойную работу преагрегат-связка:

Код: sql
1.
2.
3.
4.
5.
select
...............
(select count(1) from tab2 where....) cnt2,
(select count(1) from tab3 where....) cnt3,
from tab



или

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select 
  z.id,
  z.cnt2,
  count(tab3.id) cnt3
from
(
  select
    tab.id
    count(tab2.id) cnt2
  from tab left_join  tab2 on.............
  group by tab.id 
) z
left join  tab2 on.............
group by z.id 
...
Рейтинг: 0 / 0
23.08.2013, 16:56:43
    #38376132
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять где косяк в запросе
....ну в смысле ТАБ3 в предпоследней строчке...
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите понять где косяк в запросе / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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