我有以下架构:
TABLE bands
-> band_id
-> property1
-> property2
-> ...
TABLE tracks
-> band_id
-> track_id
tracks 表通常将单个 band_id 映射到多个 track_id(每个 band 有多个轨道)。
我的目标是为符合某些条件(根据 property1、property2 等)的乐队构建格式为(band_id、property1、property2、...乐队]).
目前我正在做
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_id 和属性,然后针对每个频段的 track_id 发出单独的查询。但这又意味着对每个波段发出单独的查询——而且有数以万计的波段,所以这可能不是很明智。
有更好的方法吗?
我一直在查看 GROUP BY,这似乎是我感兴趣的总体方向,但我找不到一个聚合函数,它基本上会为表中的每个匹配记录返回一个值列表(在本例中为 track_ids)乐队。
最佳答案
您可以以 (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;
从数据库中读取结果后,您可以将结果放入您选择的结构中。
关于sql 语句检索给定记录的结果列表(从其他表)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1962026/