【问题标题】:SQL join over five tablesSQL 连接五个表
【发布时间】:2009-07-01 16:12:47
【问题描述】:

我有五张桌子:

型号:ID、名称、规格 models_networks:id、model_id、network_id 网络:ID、名称、描述 countries_networks:id、country_id、network_id 国家:id、countryName 等
  • models 表通过models_networks 以多对多关系连接到networks 表。
  • networks 表通过countries_networks 以多对多关系连接到countries

我需要做以下查询,但我卡住了:

选择所有适用于特定国家/地区的模型。

例如:假设法国有两个网络。 PigNetwork 和 CowNetwork。我想获得在 PigNetwork 或 CowNetwork 上工作的所有模型,基本上是在那个国家以某种方式工作的任何模型。

如果我已经说清楚了,有人可以帮忙处理 JOIN 查询吗?我以前只加入过两张桌子。谢谢。

【问题讨论】:

  • 伙计们,我很难选择接受的答案,因为它们都工作得很好。非常感谢大家。

标签: sql mysql join


【解决方案1】:
SELECT
  m.name AS model_name,
  c.countryName,
  COUNT(*) AS network_count
FROM
  models                        AS  m
  INNER JOIN models_networks    AS mn ON mn.model_id = m.id
  INNER JOIN networks           AS  n ON n.id = mn.network_id
  INNER JOIN countries_networks AS cn ON cn.network_id = n.id
  INNER JOIN countries          AS  c ON c.id = cn.country_id
WHERE
  c.countryName = 'France'
GROUP BY
  m.name,
  c.countryName

【讨论】:

    【解决方案2】:

    类似的东西应该可以工作......

    SELECT M.Name As ModelName FROM Countries C
    INNER JOIN Countries_Networks CN
    ON C.CountryId = CN.CountryId
    INNER JOIN Networks N
    ON CN.NetworkId = N.NetworkId
    INNER JOIN ModelNetworks MN
    ON MN.NetworkId = N.NetworkId
    INNER JOIN Model M
    ON M.ModelId = MN.ModelId
    WHERE C.CountryName = 'FRANCE'
    

    【讨论】:

      【解决方案3】:
      SELECT  m.id
      FROM    model m
      WHERE   EXISTS
              (
              SELECT  NULL
              FROM    model_networks mn
              JOIN    countries_networks cn
              ON      cn.network_id = mn.network_id
                      AND cn.country_id = @code_of_france
              WHERE   mn.model_id = m.id
              )
      

      这是有效的,因为它会在找到第一个合适的网络时立即返回一个模型。

      确保您具有以下UNIQUE 索引:

      model_networks (model_id, network_id)
      country_network (country_id, network_id)
      

      【讨论】:

        【解决方案4】:
        SELECT models.id, models.name, models.specifications JOIN models_networks ON models.id=models_networks.model_id WHERE models_networks.networks_id IN (1,2)
        

        (将 1,2 替换为您的网络 ID)

        如果您只想要模型,看起来不需要两个连接。如果您不知道网络 ID 或需要其他表中的列,则只需要更多连接。不过,它的语法是相同的。您只需在 WHERE 语句之前以 JOIN <table> ON <field>=<field> 开头

        【讨论】:

          【解决方案5】:
          select models.id, models.name, models.specification from models inner join models_networks on models.id = models_network.network_id inner join countries_networks on models_network.network_id = countries_networks.network_id where countries_networks.countryName = 'France'
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-01-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-09
            • 2020-10-11
            • 2012-02-28
            • 2012-05-01
            相关资源
            最近更新 更多