【问题标题】:Need help with my query需要帮助我的查询
【发布时间】:2009-08-10 03:54:04
【问题描述】:

对不起,这个可怕的标题,不知道如何解释。我有一个看起来像这样的查询:

SELECT `name`, `latitude`, `longitude`, `indoor`, `address`,
    `phone`, `email`, `website`, `closed`
FROM rocks INNER JOIN 
    (SELECT DISTINCT id FROM rock_types WHERE type="DWS" or type="Top rope")
    AS types ON rocks.id=types.id
WHERE (latitude>-180 AND latitude<180) AND (longitude>-180 AND longitude<180)

除了我现在得到的之外,我还想获取与每个 id 关联的类型列表。我怎样才能做到这一点?谢谢

【问题讨论】:

  • 那么你的标题应该类似于“获取与 SQL 中的每个 ID 关联的类型列表”

标签: sql mysql database


【解决方案1】:

这是我对传统连接语法的看法:

SELECT rocks.name,
       rocks.latitude,
       rocks.longitude,
       rocks.indoor,
       rocks.address,
       rocks.phone,
       rocks.email,
       rocks.website,
       rocks.closed,
       rock_types.type

FROM   rocks,
       rock_types

WHERE  rocks.latitude  > -180                 AND
       rocks.latitude  < 180                  AND
       rocks.longitude > -180                 AND
       rocks.longitude < 180                  AND
       rocks.type_id   = rocks_types.id       AND
       rock_types.type IN ('DWS', 'Top rope')

rocks.id = rocks_types.id 在两个表之间建立链接。

这是使用INNER JOIN 编写相同查询的方法(两者都导致相同的结果)

SELECT rocks.name,
       rocks.latitude,
       rocks.longitude,
       rocks.indoor,
       rocks.address,
       rocks.phone,
       rocks.email,
       rocks.website,
       rocks.closed,
       rock_types.type

FROM   rocks
       INNER JOIN rocks_types ON rocks.type_id = rocks_types.id

WHERE  rocks.latitude  > -180                 AND
       rocks.latitude  < 180                  AND
       rocks.longitude > -180                 AND
       rocks.longitude < 180                  AND
       rock_types.type IN ('DWS', 'Top rope')

编辑:根据您的评论,以下将为您提供逗号分隔的类型列表:

SELECT rocks.name,
       rocks.latitude,
       rocks.longitude,
       rocks.indoor,
       rocks.address,
       rocks.phone,
       rocks.email,
       rocks.website,
       rocks.closed,
       (SELECT    GROUP_CONCAT(DISTINCT rock_types.type SEPARATOR ',')
        FROM      rock_types
        WHERE     rock_types.id = rocks.id                AND
                  rock_types.type IN ('DWS', 'Top rope')
        GROUP BY  rock_types.id
       ) AS type

FROM   rocks

WHERE  rocks.latitude  > -180    AND
       rocks.latitude  < 180     AND
       rocks.longitude > -180    AND
       rocks.longitude < 180

【讨论】:

  • 谢谢安德鲁。如果每块岩石只有一种相关联的类型,这将起作用。然而,情况并非总是如此。岩石表是由 id 索引的岩石列表。 rock_types 表将 id 映射到 1 个或多个类型,因此例如 id=1 可能在 rock_types 中有 2 行,1 用于 DWS,1 用于顶部绳索。此查询将仅返回其中之一。是否可以获得与该 id 关联的所有类型?
  • 啊,应该将其包含在您的原始问题中。在这种情况下,让我解决这个问题。
  • 再次感谢安德鲁。做到了!
【解决方案2】:
SELECT `name`, `latitude`, `longitude`, `indoor`, `address`,
    `phone`, `email`, `website`, `closed`, 
    (SELECT GROUP_CONCAT(type SEPARATOR ',') FROM rock_types 
        WHERE (type="DWS" or type="Top rope") and  rock_types.id=rocks.id group by id) types
FROM rocks 
WHERE (latitude>-180 AND latitude<180) AND (longitude>-180 AND longitude<180)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多