【问题标题】:Problems using INNER JOIN with using Composite Key在使用复合键时使用 INNER JOIN 的问题
【发布时间】:2014-03-05 23:44:55
【问题描述】:

我对 SQL 非常陌生,而且非常新(实际上是今天学习!)如何使用 JOINS,尤其是 INNER JOIN。我已经阅读了一些指南,但没有看到任何有用的信息来说明何时有一个包含复合键的表。

表格:

Matches

+-----------+------------+
| (MatchID) | StartTime  |
+-----------+------------+
| 548576804 | 1393965361 |
| 548494906 | 1393123251 |
+-----------+------------+

+-----------------------------------+---------+
| (PlayerID)    -     (MatchID)    |   Result |
+-----------------------------------+---------+
| 38440257            548576804    |   Win    |
| 17164642            548494906    |   Loss   |
+-----------------------------------+---------+

在上述表中,Matches 表中的MatchID 是外键。

问题

括号中的列是键(因此复合键在 MatchDetails 表中)。我正在尝试从 Matches 表中提取玩家 38440257 播放的所有比赛以及 StartTime。我尝试的第一个 Join 成功了,但是不管玩家是谁,它都会拉动每一场比赛:

SELECT matchdetails.MatchID,
       matches.StartTime,
       matchdetails.Result
FROM matchdetails,
     matches
WHERE matchdetails.MatchID = matches.MatchID
ORDER BY matches.StartTime ASC

现在,我不确定如何在查询中添加我只想匹配来自特定 playerID 的点。因为以下不起作用:

SELECT matchdetails.MatchID,
       matches.StartTime,
       matchdetails.Result
FROM matchdetails,
     matches
WHERE matchdetails.MatchID = matches.MatchID,
      matchdetails.PlayerID=76561197998705985
ORDER BY matches.StartTime ASC

另外,我上面使用的JOIN,有没有更简单的方法来写我错过的?还是我根本没有写加入?我关注了来自here 的查询之一,该查询表明它们是等效查询。不过感觉写起来比较麻烦。

如果我忽略了任何信息,请告诉我。

【问题讨论】:

  • 非工作部分是否返回错误或不正确的数据?

标签: mysql sql join


【解决方案1】:

你的谓词之间只需要AND

SELECT matchdetails.MatchID,
       matches.StartTime,
       matchdetails.Result
FROM matchdetails,
     matches
WHERE matchdetails.MatchID = matches.MatchID
      AND matchdetails.PlayerID=76561197998705985
ORDER BY matches.StartTime ASC;

但是,我强烈推荐您 move away from the ANSI 89 JOIN syntax 并改用 ANSI 92。顾名思义,您使用的语法已经过时了 20 多年。

SELECT matchdetails.MatchID,
       matches.StartTime,
       matchdetails.Result
FROM matchdetails
     INNER JOIN matches
        ON matchdetails.MatchID = matches.MatchID
WHERE matchdetails.PlayerID=76561197998705985
ORDER BY matches.StartTime ASC;

【讨论】:

  • 感谢您的简洁回复。我确实认为我的 JOIN 查询有些地方不太对劲,但我不确定它是什么或如何找出问题所在。我将更改为较新的版本并阅读它!
【解决方案2】:
SELECT matchdetails.MatchID,
       matches.StartTime,
       matchdetails.Result
FROM matchdetails 
     JOIN ON matchdetails.MatchID = matches.MatchID
WHERE
      matchdetails.PlayerID=76561197998705985
ORDER BY matches.StartTime ASC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 2011-03-25
    • 2012-04-05
    相关资源
    最近更新 更多