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 个用户的名称,因为game有 2 个用户。我希望这些列被命名为target_namesource_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.nametarget_nameorsource_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

您需要在桌子上加入桌子user两次game才能获得游戏的两个名称。我之所以添加COALESCE是因为它对于显示列的描述性值很有用。NULL例如,如果源或目标没有值,则将显示的值是`-no value-。

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 回答