0

假设我有一个名为联系人的 MySQL 表。它看起来像这样:

+----------+
|contacts  |
+----------+
|id: int   |
|name: vc  |
|rank: int |
+----------+

'rank' 是映射到名为 rank 的表的外键,如下所示:

+--------+
|ranks   |
+--------+
|id: int |
|name: vc|
+--------+

我做了一个看起来像这样的 sql 查询,希望我能为每个用户获得一个排名,但它只给了我第一个匹配排名的用户:

SELECT c.id, c.name, c.rank, r.name as rank_name FROM contacts c 
INNER JOIN ranks r ON r.id=c.rank

在我看来,这将是获取联系人列表的正确 SQL 语句,其中还包含他们各自的等级名称。但是,每个等级我只能取回一个联系人,而且它始终是第一个联系人(如果按contact.id 排序)。

有什么解决办法吗?也许我错过了一些太容易的东西。我不知道。

谢谢!

编辑

根据请求,以下是一些行:

Table: ranks
id      name
6       Primary
7       Secondary
10      Test

Table: contacts
id      name        rank
1       Joe         6
2       Jane        6
3       Mike        7
4       Adam        10
5       Edna        7
4

3 回答 3

0

您的查询看起来不错,但问题可能出在您的数据上。你能验证你的数据,给我们看一些记录吗?

特别是问题可能是不是每个等级(或联系人)在另一个表中都有适当的数字。

于 2012-08-09T21:18:53.307 回答
0

您的 SQL 客户端是否包含 LIMIT 1,1?

通过使用 INNER JOIN,您将只获得两个表中存在的行(即匹配)。如果您想获得无等级的联系人,您可以使用 LEFT JOIN。

于 2012-08-09T21:21:58.097 回答
0

这不是多对多关系,因为您仅将 1 个等级映射到 0 个或更多联系人。

完全一样的查询应该可以工作。您能否向我们提供更多数据,例如确切查询中的内容以及表中的数据?

编辑:数据看起来不错。您是否正在使用

GROUP BY rank.id

在您的确切查询中?

于 2012-08-09T21:24:05.857 回答