SQL оператор для получения списка результатов (из другой таблицы) для данной записи? - PullRequest
2 голосов
/ 26 декабря 2009

У меня есть следующая схема:

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) для каждой соответствующей записи в таблице полосы.

Ответы [ 2 ]

1 голос
/ 26 декабря 2009

Вы можете вернуть данные в форме (band_id, [список track_ids для этого диапазона в виде строки, разделенной запятыми]), но это не SQL-способ. Посмотрите на GROUP_CONCAT (для MySQL).

То, как вы сейчас это делаете, обычно лучше, хотя вы должны использовать явное ключевое слово JOIN.

SELECT bands.band_id, track_id
FROM bands
LEFT JOIN tracks ON tracks.band_id = bands.band_id
WHERE bands.property1 = xyz;

Вы можете поместить результаты в структуру по вашему выбору, как только прочитаете их из базы данных.

1 голос
/ 26 декабря 2009

Если вы хотите создать строку и используете MySQL, есть функция агрегации GROUP_CONCAT, но, по крайней мере, в SQL Server нет простого эквивалента. Для SQL Server вы можете использовать FOR XML-запросы для создания XML-вывода с нужной вам группировкой, но я не уверен, насколько это полезно в целом. (Во многих моих приложениях я использую запросы FOR XML для извлечения данных из базы данных, а затем XSLT для преобразования их в HTML для отображения в Интернете, но я знаю, что это довольно специфическое решение, а не общее.)

...