У меня есть следующая схема:
TABLE bands
-> band_id
-> property1
-> property2
-> ...
TABLE tracks
-> band_id
-> track_id
Таблица треков обычно отображает один band_id на несколько track_ids (для каждой полосы есть несколько треков).
Моя цель - создать для полос, соответствующих определенным условиям (с точки зрения property1, property2 и т. Д.), Структуру данных формата (band_id, property1, property2, ..., [список track_ids для этого группа]).
В настоящее время я делаю
SELECT band_id, property1, property2, ..., track_id
FROM bands, tracks
WHERE bands.property1 = xyz;
Это генерирует кортежи (band_id, property1, property2, ..., track_id) для соответствующих полос; один кортеж для каждой дорожки. В настоящее время я беру это и собираю (в моем не-sql-коде) все track_ids для данной группы в список. Но это кажется очень расточительным, поскольку все значения, кроме 'propertyN', возвращаются несколько раз для каждой отдельной полосы.
Альтернативой, о которой я подумал, было сначала получить band_ids и свойства для соответствующих полос, а затем выдать отдельный запрос для track_ids для каждой полосы. Но это, в свою очередь, означает выдачу отдельного запроса для каждой полосы - и их десятки тысяч, так что это, вероятно, не очень разумно.
Есть ли лучший способ сделать это?
Я смотрел на GROUP BY, и это, кажется, общее направление, которое меня интересует, но я не смог найти агрегатную функцию, которая бы в основном возвращала список значений (в данном случае track_ids) для каждой соответствующей записи в таблице полосы.