创建SQL查询,从一个表中获取数据时WHEN ID

时间:2012-08-19 21:43:31

标签: mysql sql

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

我有一个名为艺术家的表格,其中包含会员ID,艺术家姓名和网页的网址,所有这些都需要检索。如果此表中没有ID,则不应将其包含在语句的输出中。

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

第三个表是一个名为事件的表。通过触发器将数据插入此处AFTER数据被添加到我引用的任何其他表中。此表包含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

TRACKS

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

STATUS

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请求的新闻Feed页面中。输出将是符合的;

艺术家上传了一首曲目 跟踪到这里
格式化时间戳

<小时/> 另一位艺术家有一些新闻 新闻在这里
格式化时间戳


希望这会给你一个想法。

最后的所有数据都应按时间戳排序。提前谢谢。

1 个答案:

答案 0 :(得分: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天内执行的所有活动;最近的第一次。