MySQL Join с денормализованным атрибутом join - PullRequest
0 голосов
/ 30 ноября 2018

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

Схема выглядит следующим образом.Существует таблица services, которая состоит из нескольких атрибутов, где особенно важен атрибут property.Ниже приведены примеры строк таблицы report:

table: report

id | vehicles | ...
-------------------
1  | 1,2,3    | ...
2  | 2,3      | ...
3  | 2        | ...

Таблицы vehicle выглядят следующим образом:

table: vehicle

vid | description
---------------
1   | Vehicle A
2   | Vehicle B
3   | Vehicle C

Моя цель состоит в том, чтобы подсчитать частоту, с которой транспортное средство участвовалоотчета.Желаемые строки результата:

desired result

description | count(*)
----------------------
Vehicle A   | 1
Vehicle B   | 3
Vehicle C   | 2

Псевдопросмотр для этого будет выглядеть примерно так:

SELECT v.description, Count(*)
FROM report r
JOIN vehicles v
ON v.vid IN(r.vehicles)
GROUP BY v.description;

Есть ли способ MySQL для обработки этого на стороне базы данных?Или я должен выбрать все, взорвать транспортные средства при входе в приложение и выполнить «соединение» вне базы данных?

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

1 Ответ

0 голосов
/ 02 декабря 2018

Я обнаружил, что MySQL поддерживает функцию FIND_IN_SET, в которой вы можете передать строку для поиска и список для поиска.

Следовательно, запрос, который работает:

SELECT v.description as description, COUNT(*) as count
FROM report r
JOIN vehicles v
ON FIND_IN_SET(v.vid, r.vehicles)
GROUP BY (v.description);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...