我有以下架构:
TABLE bands
-> band_id
-> property1
-> property2
-> ...
TABLE tracks
-> band_id
-> track_id
轨道表通常将单个band_id映射到多个track_id(每个波段有多个轨道)。
我的目标是为符合某些条件(就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_id放入一个列表中。但它似乎非常浪费,因为除了'propertyN'值之外,每个单独的波段都会多次返回。
我想到的另一种方法是先获取匹配波段的band_ids和属性,然后为每个波段的track_ids发出单独的查询。但是,这反过来意味着为每个乐队发出一个单独的查询 - 并且有数万个乐队,所以这可能不是很聪明。
有更好的方法吗?
我一直在看GROUP BY,这似乎是我感兴趣的一般方向,但我找不到一个聚合函数,它基本上会为表中的每个匹配记录返回一个值列表(在本例中为track_ids)频带。
答案 0 :(得分:1)
如果你想生成一个字符串而你正在使用MySQL,那么就有一个GROUP_CONCAT聚合函数,但至少在SQL Server中没有简单的等价物。对于SQL Server,您可以使用FOR XML查询来生成具有所需分组类型的XML输出,但我不确定它是多么有用。 (在我的许多应用程序中,我使用FOR XML查询从数据库中提取数据,然后使用XSLT将其转换为HTML以便在Web上显示,但我知道这是一个相当具体的解决方案,而不是一般的解决方案。)
答案 1 :(得分:1)
您可以返回表单中的数据(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;
一旦从数据库中读取结果,就可以将结果放入您选择的结构中。