SQL-запрос, чтобы найти количество объединенных строк таблицы как сводка для каждой строки

У меня есть таблица виджетов, которая выглядит так:

id (integer)
referrer (varchar(255))
width (integer)
height (integer)

... и некоторые другие.

У меня также есть таблица событий, которые выглядят так:

id (integer)
widgetid (integer)
eventtype (string)
created_at (datetime)

... и некоторые другие.

Я хочу получить примерную таблицу данных, которая найдет для каждого виджета подробную информацию о себе и связанных событиях для определенных типов событий (один раз для типов событий A, B и C и один раз для типа события A).

Для этого мне нужно использовать не-вендор-специфический (то есть ANSI SQL), он должен работать как на PostgreSQL, так и на MySQL.

Я пытаюсь что-то сродни этому, но это очень медленно:

SELECT w.id, w.referrer, w.width, w.height, COUNT(e.widgetid), COUNT(f.widgetid)
FROM widgets w
JOIN events e on (e.widgetid = w.id AND e.eventtype = 'A')
JOIN events f on (f.widgetid = w.id AND f.eventtype IN ('A','B','C'))
GROUP BY w.id;

но это невероятно медленно (естественно). Есть индексы на e.widgetid, e.eventtype и w.id.

Я структурирую это право, и как я могу сделать это быстрее (индексирование на виджетах, конечно, невзирая на)?

Я думал о выполнении подзапросов, но без знания идентификатора виджета для каждой строки (есть ли для этого функция?) Я не очень далеко.

Я также не совсем уверен, к какой СОЕДИНЕНИЮ я должен использовать. Я думаю (но исправьте меня, если я ошибаюсь), что для этого подходит ЛЕВЫЙ или ВХОДНЫЙ ПРИСОЕДИНЯЙТЕСЬ.

ура

1 ответ

Ваш JOIN медленный, потому что у вас нет индексов, или у вас есть индексы, но не для значений, с которыми вы подключаетесь.

Добавьте индекс для id, widgetid и eventtype, и я заверяю вас, что он продемонстрирует значительное увеличение скорости.

licensed under cc by-sa 3.0 with attribution.