0

ニュース フィードを作成しようとしていますが、以前の質問からそれを実行する最も簡単な方法を見つけましたが、SQL でどのようなクエリを作成すればよいかわかりません。

メンバーID、アーティスト名、ページへのURLを含むアーティストというタイトルのテーブルがあり、すべてを取得する必要があります。ID がこの表にない場合、ステートメントの出力に含めるべきではありません。

トラック、ステータス、ニュースなど、同様の構造を持つテーブルがいくつかあります。他にもありますが、この質問ではこれら 3 つに固執し、後ほどさらに追加できます。これらの表には特に ID が含まれており、これらは後で提供します。

3 番目のテーブルは、イベントというタイトルの 1 つです。私が参照した他のテーブルにデータが追加された後、トリガーを介してデータがここに挿入されます。このテーブルには、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 に答える