【问题标题】:MySQL: multiple selects, multiple joins?MySQL:多重选择,多重连接?
【发布时间】:2012-02-10 02:02:31
【问题描述】:

我有一组多个表(剥离的概述):

Brand;
+--------------------+--------------+------+-----+---------+-------+
| Field              | Type         | Null | Key | Default | Extra |
+--------------------+--------------+------+-----+---------+-------+
| id                 | tinyint(10)  | NO   | PRI | NULL    |       |
| name               | varchar(255) | NO   |     | NULL    |       |
+--------------------+--------------+------+-----+---------+-------+

Relations;
+--------------------+--------------+------+-----+---------+-------+
| Field              | Type         | Null | Key | Default | Extra |
+--------------------+--------------+------+-----+---------+-------+
| id1                | tinyint(10)  | NO   | PRI | NULL    |       |
| id2                | tinyint(10)  | NO   | PRI | NULL    |       |
+--------------------+--------------+------+-----+---------+-------+

Country;
+--------------------+--------------+------+-----+---------+-------+
| Field              | Type         | Null | Key | Default | Extra |
+--------------------+--------------+------+-----+---------+-------+
| id                 | tinyint(10)  | NO   | PRI | NULL    |       |
| name               | varchar(255) | NO   |     | NULL    |       |
+--------------------+--------------+------+-----+---------+-------+

City;
+--------------------+--------------+------+-----+---------+-------+
| Field              | Type         | Null | Key | Default | Extra |
+--------------------+--------------+------+-----+---------+-------+
| id                 | tinyint(10)  | NO   | PRI | NULL    |       |
| name               | varchar(255) | NO   |     | NULL    |       |
+--------------------+--------------+------+-----+---------+-------+

每一行都有一个唯一的 ID。品牌表中的每一行都与一个国家和一个城市有关系。这些表之间的关系存储在关系表中,因此关系表中每个品牌行都有两行。

我正在尝试获取给定品牌 ID 的品牌名称、国家名称和城市名称。我可以通过单独的选择来选择这些关系,但我的目标是(如果可能的话)在单个查询中完成。

我能够获得其中一个关系(国家),但我也想获得城市:

SELECT Brand.name as brand, Country.name as country
FROM Brand 
LEFT JOIN _relations 
ON Relations.id1 = Brand.id 
INNER JOIN Country 
ON Country.id = Relations.id2 
WHERE Brand.id = '123456';

结果:

+-----------+-------------+
| brand     | country     |
+-----------+-------------+
| brandname | countryname |
+-----------+-------------+

我的目标是:

+-----------+-------------+-------------+
| brand     | country     | city        |
+-----------+-------------+-------------+
| brandname | countryname | cityname    |
+-----------+-------------+-------------+

有人可以帮我解决这个问题或指出正确的方向吗?

【问题讨论】:

    标签: mysql select join


    【解决方案1】:

    以不同的别名再次加入关系表。

    类似这样的:

    SELECT Brand.name as brand, Country.name as country, City.name as city
    FROM Brand 
    LEFT JOIN Relations ON Relations.id1 = Brand.id 
    INNER JOIN Country ON Country.id = Relations.id2 
    LEFT JOIN Relations r2 ON r2.id1 = Brand.id
    LEFT JOIN City ON City.id = r2.id2
    WHERE Brand.id = '123456';
    

    【讨论】:

      【解决方案2】:

      基本上你再次加入关系,然后用它来获得城市,所以像

      SELECT Brand.name as brand, Country.name as country, City.Name as City
      FROM Brand 
      LEFT JOIN _relations relCountry
      ON relCountry.id1 = Brand.id 
      INNER JOIN Country 
      ON Country.id = relCountry.id2 
      LEFT JOIN _relations relCity 
      ON relCity.id1 = Brand.id 
      INNER JOIN City 
      ON City.id = relCity.id2 
      

      【讨论】:

      • 太好了,谢谢,这是一个完美的解决方案。但是我遇到了一个新问题。如果一个城市不存在一个品牌怎么办。如果在关系表中没有找到城市 ID,它现在返回 0 行。有没有办法忽略连接并返回 null 或者可能是 City 字段的自定义值?我想检索品牌名称、国家名称和一个空的城市字段,而不是没有结果。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      相关资源
      最近更新 更多