0

我正在尝试创建新闻提要,并且从以前的问题中找到了执行它的最简单方法,但不知道我应该在 SQL 中进行哪种查询。

我有一个标题为艺术家的表格,其中包含成员 ID、艺术家姓名和他们页面的 url,都需要检索。如果 ID 不在此表中,则不应将其包含在语句的输出中。

我有几个具有相似结构的表,例如曲目、状态和新闻。还有更多,但对于这个问题,我们将坚持这三个,我可以稍后添加更多。在这些表中是 ID 以及其他内容,我将在稍后提供这些内容。

第三个表是一个标题为事件。在将数据添加到我引用的任何其他表之后,数据通过触发器插入到此处。此表包含 ID、操作(例如“已上传曲目。”)和时间戳。

艺术家表;

CREATE TABLE `artists` (
`ID` int(11) NOT NULL,
`name` varchar(100) COLLATE latin1_general_ci NOT NULL,
`url` varchar(100) COLLATE latin1_general_ci NOT NULL,
`DP` varchar(200) COLLATE latin1_general_ci NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY `url` (`url`),
UNIQUE KEY `DP` (`DP`),
KEY `ID` (`ID`),
CONSTRAINT `artists_ibfk_1` FOREIGN KEY (`ID`) REFERENCES `members` (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci

曲目

CREATE TABLE `tracks` (
`ID` int(11) NOT NULL,
`url` varchar(200) COLLATE latin1_general_ci NOT NULL,
`name` varchar(100) COLLATE latin1_general_ci NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
`track_ID` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`track_ID`),
UNIQUE KEY `url` (`url`),
UNIQUE KEY `track_ID` (`track_ID`),
KEY `ID` (`ID`),
CONSTRAINT `tracks_ibfk_1` FOREIGN KEY (`ID`) REFERENCES `members` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=111112 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci

消息

CREATE TABLE `news` (
`ID` int(11) NOT NULL,
`article` text COLLATE latin1_general_ci NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
KEY `ID` (`ID`),

) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci

地位

CREATE TABLE `status` (
`ID` int(11) NOT NULL,
`status` varchar(300) COLLATE latin1_general_ci NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
KEY `ID` (`ID`),
CONSTRAINT `status_ibfk_1` FOREIGN KEY (`ID`) REFERENCES `artists` (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci

活动

CREATE TABLE `events` (
`ID` int(11) NOT NULL,
`action` varchar(100) COLLATE latin1_general_ci NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
KEY `ID` (`ID`),
CONSTRAINT `events_ibfk_1` FOREIGN KEY (`ID`) REFERENCES `members` (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci COMMENT='This table shows what the artist has done and is used feed'

我尝试过的查询失败了。这仅引用曲目和事件表。我不确定如何将其他表添加到查询中。

SELECT
T.url,
T.ID,

E.action,
E.ID,
E.timestamp

FROM tracks T
JOIN events E ON T.ID = E.ID
WHERE T.ID = E.ID AND E.action = 'has uploaded a track.'
ORDER BY E.timestamp DESC

为了回答非常有效的评论,查询位于新闻提要的 AJAX 请求页面中。输出将类似于以下内容;

一位艺术家上传了曲目。
跟踪在这里
格式化的时间戳在这里


另一位艺术家有一些消息。
新闻在这里
格式化的时间戳在这里


希望这会给你一个想法。

它末尾的所有数据都应按时间戳排序。提前致谢。

4

1 回答 1

0

如果您有一个包含所有事件的表,以及您想要显示的消息,我很困惑为什么您必须加入任何其他表——也许除了您的成员表之外,这会给你是用户名。由于您希望每个事件都有自己的记录,因此不需要任何类型的聚合。(不过,如果您确实想为用户显示逗号分隔的操作列表,请查看GROUP_CONCAT。)

例如像这样的查询:

SELECT
    CASE
      WHEN events.table_name = "tracks" THEN "has uploaded a track."
      WHEN events.table_name = "news" THEN "has some news."
    END AS description
  , events.action
  , DATE_FORMAT(events.when_it_happened, "%a %l%p") AS when_it_happened
  , members.username
  , members.ID
FROM events
INNER JOIN members ON (events.ID = members.ID)
WHERE events.when_it_happened >= NOW() - INTERVAL 5 DAY
ORDER BY events.when_it_happened DESC

将为您提供所有用户在过去 5 天内执行的所有事件;最近的第一个。

于 2012-08-20T01:44:56.797 回答