2

我有两张桌子:

Users
=====================================
id, name, country_id, nationality_id

Countries
=====================================
id, name, currency

country_id并且nationality_id都使用国家表中的 id。

country_id并且nationality_id不一定相同。

我想要得到的是一个表格,其中包含给定国家/地区的每个用户的姓名、他们国家/地区的名称nationality_id以及他们使用的货币country_id

我的问题是如何执行 WHERE 子句。这就是我所拥有的,但这是不正确的,因为货币回来了nationality_id而不是country_id.

希望这是有道理的......

SELECT
    Users.name,
    Countries.name,
    Countries.currency
FROM
    Users, Countries
WHERE
    Users.nationality_id = Countries.id 
AND Countries.id = 6
4

4 回答 4

5

诀窍是使用两个Countries具有不同别名的连接,一个用于nationality_id,另一个用于country_id。

SELECT
    Users.name,
    /* name from the nationality_id join */
    cn.name,
    /* currency from the country_id join */
    cc.currency
FROM
    Users
      JOIN Countries cn ON Users.nationality_id = cn.id 
      JOIN Countries cc ON Users.country_id = cc.id 
WHERE 
    Users.country_id = 6
于 2012-04-23T13:36:08.693 回答
3

您需要两次加入countries餐桌 - 一次是国籍,一次是居住国。为此,您可以使用别名,如下面的查询所示。

SELECT
 users.*,
 nationality.name AS nationality,
 resident_country.currency
FROM
  users
INNER JOIN
  countries       AS nationality
    ON users.nationality_id = nationality.id
INNER JOIN
  countries       AS resident_country
    ON users.country_id     = resident_country.id
WHERE
  users.country_id = 6

然后,您可以按users表格过滤所有内容。我按常驻国家/地区过滤,您可以使用users.nationality_id = 6或任何您喜欢的方式将其更改为国籍。如果您需要按countries表的内容进行过滤,您可以按适当的别名进行过滤。

(您不能引用countriesusing countries.???,因为每次在查询中使用它时都会给它一个别名。)

于 2012-04-23T13:36:12.280 回答
0
Select * from Users u 
left join Countries c 
on c.id = u.nationality_id 
where c.id = 6
于 2012-04-23T13:36:40.687 回答
0

不知道为什么你会做 dat 因为有 2 列使用来自不同表的相同 id 无论如何这就是我会这样做 -

  SELECT Users.name, nt.name, curr.currency FROM
    Users
      JOIN Countries nt ON Users.nationality_id = nt.id 
      JOIN Countries curr ON Users.country_id = curr.id 
   WHERE 
    Users.country_id = 6
于 2012-04-23T13:41:56.010 回答