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

标签 sql mysql group-by aggregate

我有以下架构:

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/

相关文章:

php - MySQL 中的复杂搜索

mysql - 缓慢的 MySQL 查询

mysql - 选择包含一个词的条目

MYSQL 按兼容性分组产品

Oracle Group by NULL 中的 SQL 返回多行

mysql - 将选择结果添加到另一个选择并创建一个 json 键

php - 编辑表的特定字段

mysql - SQL-将结果列中的所有值相加,并使用同一查询中的另一列计算百分比

php - CDash - 安装,按照文档操作后我无法在 CDash/install.php 中注册

sql - GROUP BY 与 ORDER BY 组合