【问题标题】:sql statement to retrieve a list of results (from other table) for a given record?sql 语句检索给定记录的结果列表(从其他表)?
【发布时间】:2009-12-25 21:48:17
【问题描述】:

我有以下架构:

TABLE bands
-> band_id
-> property1
-> property2
-> ...

TABLE tracks
-> band_id
-> track_id

tracks 表通常将单个 band_id 映射到多个 track_id(每个 band 有多个轨道)。

我的目标是为符合特定条件(根据 property1、property2 等)的 band 构建格式为(band_id、property1、property2、...、[list of track_ids for that)的数据结构乐队])。

目前我在做

SELECT band_id, property1, property2, ..., track_id 
  FROM bands, tracks 
 WHERE bands.property1 = xyz;

这会为匹配的波段生成元组 (band_id, property1, property2, ..., track_id);每个轨道一个元组。目前,我采用这个并将给定波段的所有 track_ids 聚合(在我的非 sql 代码中)到一个列表中。但这似乎非常浪费,因为除了“propertyN”之外的所有值都会为每个单独的波段多次返回。

我想到的替代方法是首先获取匹配波段的 band_ids 和属性,然后为每个波段的 track_ids 发出单独的查询。但这反过来又意味着为每个波段发出单独的查询——而且有成千上万个,所以这可能不是很聪明。

有没有更好的方法来做到这一点?
我一直在研究 GROUP BY,这似乎是我感兴趣的一般方向,但我找不到一个聚合函数,它基本上会为表中的每个匹配记录返回一个值列表(在本例中为 track_ids)乐队。

【问题讨论】:

  • 您能提供一个示例说明您希望输出的样子吗?

标签: sql mysql group-by aggregate


【解决方案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;

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

【讨论】:

  • 谢谢,我在mysql上!虽然不标准,但这正是我想要的。
  • mark,你能详细说明一下为什么当前的方法比使用那个漂亮的连接函数更好吗?谢谢!
  • 这是因为连接产生了一个字符串而不是一个实际的列表。列表通常不是原生 SQL 数据类型。
  • @laramichaels:您的原始查询使用 ANSI-89 JOIN 语法,它不提供实现 LEFT JOIN 的一致方法,Mark Byers 提供的 ANSI-92 版本提供了一致的方法。跨度>
  • 因为您将所有整数转换为字符串并将它们连接起来,然后当您返回结果时您可能必须拆分字符串并再次解析。这将增加所需的处理量,如果您的 id 超过 4 位,可能还会增加数据大小。
【解决方案2】:

如果你想生成一个字符串并且你正在使用 MySQL,那么有一个 GROUP_CONCAT 聚合函数,但至少在 SQL Server 中没有简单的等价函数。对于 SQL Server,您可以使用 FOR XML 查询来生成具有所需分组类型的 XML 输出,但我不确定这通常有多大帮助。 (在我的许多应用程序中,我使用 FOR XML 查询从数据库中提取数据,然后使用 XSLT 将其转换为 HTML 以在 Web 上显示,但我知道这是一个相当具体的解决方案,而不是通用的解决方案。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多