sql语句检索给定记录的结果列表(来自其他表)?

时间:2009-12-25 21:48:18

标签: sql mysql group-by aggregate

我有以下架构:

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)频带。

2 个答案:

答案 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;

一旦从数据库中读取结果,就可以将结果放入您选择的结构中。