0

contact という MySQL テーブルがあるとします。次のようになります。

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

「ランク」は、次のようなランクと呼ばれるテーブルにマップされた外部キーです。

+--------+
|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 ステートメントであると思われます。ただし、ランクごとに 1 つの連絡先しか返されず、常に最初の連絡先になります (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 に答える