admin

停止SQL在JOIN中两次返回相同的结果

sql

我已经联合了几个表来获取我想要的数据,但是由于我是SQL的新手,所以我不知道如何停止多次返回数据。

她是SQL语句;

SELECT
   T.url,
   T.ID,

   S.status,
   S.ID,

   E.action,
   E.ID,
   E.timestamp

FROM tracks T, status S, events E
WHERE S.ID AND T.ID = E.ID

ORDER BY E.timestamp DESC

返回的数据是这样的:

+----------------------------------------------------------------+
| URL | ID | Status | ID | action               | ID | timestamp |
+----------------------------------------------------------------+
| T.1 | 4  | hello  | 4  | has uploaded a track | 4  | time      |
| T.2 | 3  | bye    | 3  | has some news        | 3  | time      |
| t.1 | 4  | more   | 4  | has some news        | 4  | time      |
+----------------------------------------------------------------+

这是一个非常基本的示例,但它概述了发生的情况。如果您查看第三行,则在状态不同时,URL会重复。

这就是我想发生的事情;

+-------------------------------------------------------+
| URL or Status | ID | action               | timestamp |
+-------------------------------------------------------+
| T.1           | 4  | has uploaded a track | time      |
| hello         | 3  | has some news        | time      |
| bye           | 4  | has some news        | time      |
+-------------------------------------------------------+

请注意,该动作已上传曲目时,将显示url(本例中为T.1)。这个非常重要。事件表中的操作是在状态或音轨插入触发时插入的。如果插入了新轨道,则操作是“已上载轨道”,并且您猜测状态是什么。此时,ID和时间戳也已插入到事件表中。

注意:查询中 有更多表,实际上还有3个表,但为简单起见,我将其省略。


阅读 161

收藏
2021-07-01

共1个答案

admin

不要使用20年过期的语法。尽管许多RDBMS支持FROM a, b, c样式语法,但我使用过的所有系统均已弃用该语法。
(我还没有处理所有事情,但是强烈建议不要使用这种样式。)

而是使用ANSI-92标准JOIN语法。那就更难把事情弄错了…

SELECT
  *
FROM
  status S
INNER JOIN
  tracks T
    ON T.ID = S.ID
INNER JOIN
  events E
    ON E.ID = S.ID
ORDER BY
  E.timestamp DESC

此外,您的示例数据还建议您在表S中具有以下内容:

 Status | ID
--------+----
 hello  | 4
 bye    | 3
 more   | 4

ID = 4有两排。如果您确实希望T中的每一行仅连接S中的一行,那么您应该选择哪一行?应该删除一个,还是还有其他逻辑/条件可以用来选择两者之一?

2021-07-01