0

私がここで得た質問はばかげているように見えるかもしれませんが、MySQLの参加がどのように機能するかを理解できないため、少し頭がおかしくなります。

私は2つのテーブルを持っています:

user;
+--------------------+--------------+------+-----+---------+-------+
| Field              | Type         | Null | Key | Default | Extra |
+--------------------+--------------+------+-----+---------+-------+
| id                 | int(11)      | NO   | PRI | NULL    |       |
| name               | varchar(128) | NO   |     | NULL    |       |
+--------------------+--------------+------+-----+---------+-------+

game;
+--------------------+--------------+------+-----+---------+-------+
| Field              | Type         | Null | Key | Default | Extra |
+--------------------+--------------+------+-----+---------+-------+
| id                 | int(11)      | NO   | PRI | NULL    |       |
| source_id*         | int(11)      | NO   |     | NULL    |       |
| target_id*         | int(11)      | NO   |     | NULL    |       |
+--------------------+--------------+------+-----+---------+-------+

game.source_idおよびgame.target_idは、を参照する制約ですuser.id

gameここで、テーブルからすべてを選択し、2人のユーザーがいるため、2人のユーザーの結果名に含めたいと思いgameます。target_nameそして、それらの列に具体的に名前を付けたいと思いますsource_name

このクエリを試しました

SELECT
    g.id,
    u.name
FROM
    game g
RIGHT JOIN
    user u
ON
    u.id = g.source_id 
OR
    u.id = g.target_id
WHERE
    g.source_id = 1
OR
    g.target_id = 1
;

しかし、お気づきかもしれませんが、私はエイリアスu.nameを作成しません。また、その方法がわからないため、最終結果は次のようになりますtarget_namesource_name

+----+------+
| id | name |
+----+------+
| 1  | bo   |
| 1  | al   |
| 2  | jo   |
| 2  | jay  |
+----+------+

ご覧のとおりgame、結果には複数回表示されます。

期待される結果:

+----+-------------+-------------+
| id | target_name | source_name |
+----+-------------+-------------+
| 1  | bo          | al          |
| 2  | jo          | jay         |
+----+-------------+-------------+

前もって感謝します。

4

2 に答える 2

1

ゲームの 2 つの名前を取得するには、テーブルにuser2 回参加する必要があります。列の説明的な値を表示するのに役立つため、game追加しました。たとえば、ソースまたはターゲットに値がない場合、表示される値は「-値なし-」です。COALESCENULL

SELECT  a.*,
        COALESCE(b.name,'-no source-') sourceName,
        COALESCE(c.name,'-no target-') targetName
FROM    game a
        LEFT JOIN `user` b
            on b.id = a.source_ID
        LEFT JOIN `user` c
            on on c.id = a.target_id
-- your condition here
于 2012-10-03T11:10:57.120 に答える
1
SELECT
    g.id,
    source.name,
    target.name
FROM
    game g
LEFT JOIN
    user source
ON
    source.id = g.source_id 
LEFT JOIN
    user target
ON
    target.id = g.target_id
WHERE
    g.source_id = 1
OR
    g.target_id = 1
;

where 句はオプションであり、ユーザー id=1 がプレイしたすべてのゲームをソースまたはターゲットとして検索することを目的としています。

于 2012-10-03T11:12:06.400 に答える