Как создать представление с text
columnType с именем fileTags
, значением которого является группировка всех экземпляров столбца fileTag
. tag
, imgId
которого соответствует file
. imgId
? (Кроме того, в этом представлении будет гораздо больше объединений, чем в этом.)
Моя file
таблица
+-------+----------+
| imgId | filename |
+-------+----------+
| 10 | dog.jpg |
+-------+----------+
| 20 | cat.jpg |
+-------+----------+
| 30 | bird.jpg |
+-------+----------+
Моя fileTag
таблица
+----+--------+----------+
| id | tag | imgId |
+----+--------+----------+
| 1 | fur | 10 |
+----+--------+----------+
| 2 | paw | 10 |
+----+--------+----------+
| 3 | leash | 10 |
+----+--------+----------+
| 4 | feline | 20 |
+----+--------+----------+
Моя намеченная цель. getFiles
представление (Присоединитесь к imgId и создайте текстовый столбец, содержащий все метки)
+-------+----------+-----------------------+
| imgId | filename | fileTags |
+-------+----------+-----------------------+
| 10 | dog.jpg | ["fur","paw","leash"] |
+-------+----------+-----------------------+
| 20 | cat.jpg | ["feline","litter"] |
+-------+----------+-----------------------+
| 30 | bird.jpg | ["beak","wings"] |
+-------+----------+-----------------------+
Моя попытка создания представления
SELECT
`file`.`imgId` AS `imgId`,
GROUP_CONCAT(`fileTag`.`tag`) AS `tags`
FROM
(
`file`
JOIN `fileTag` ON(
(
`file`.`imgId` = `fileTag`.`imgId`
)
)
)
GROUP BY `fileTag`.`imgId`
Моя проблема
- Если я выполняю JOIN, производительность велика, но он возвращает только те строки, в которых у этого imgId есть fileTag. Мне нужно, чтобы все файлы возвращались, даже если у них нет fileTag.
- Если я выполняю LEFT JOIN, производительность действительно плохая. Если я запускаю EXPLAIN, я вижу, что он индексирует слишком много строк для каждой таблицы.
Любая помощь будет принята с благодарностью. Спасибо.