我已经联合了几个表来获取我想要的数据,但是由于我是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个表,但为简单起见,我将其省略。
不要使用20年过期的语法。尽管许多RDBMS支持FROM a, b, c样式语法,但我使用过的所有系统均已弃用该语法。 (我还没有处理所有事情,但是强烈建议不要使用这种样式。)
FROM a, b, c
而是使用ANSI-92标准JOIN语法。那就更难把事情弄错了…
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中的一行,那么您应该选择哪一行?应该删除一个,还是还有其他逻辑/条件可以用来选择两者之一?
ID = 4