0

ニュース フィードのテーブル データの元を特定する必要があります。フィードには、「ユーザーが動画をアップロードしました」または「ユーザーが自己紹介を更新しました」などの内容が含まれている必要があります。したがって、さまざまなタイプのデータがさまざまなテーブルにあるため、データがどこから来たのかを明らかにする必要があります。SQL でこれを実行できることを願っていますが、おそらくそうではないため、PHP を選択することをお勧めします。これを行う方法がわからないので、正しい方向を指すだけです。

図を作成する時間がないので、データベースについて簡単に説明します。

1.電子メール、パスワード、ID などのすべての基本情報を含むメンバーというタイトルのテーブルがあります。ID は主キーです。

  1. 他のすべてのテーブルには、メンバー テーブル内の ID にリンクする ID の外部キーがあります。

  2. その他のテーブルには次のものがあります。トラック、ステータス、写真、ビデオ。そこからはすべて自明です。

更新されたデータがどのテーブルから来ているかをどうにかして特定する必要があるので、ユーザーに何をしたかを伝えることができます。できれば、フィード全体に対して 1 つの SQL ステートメントのみが必要なため、すべてのテーブルが結合され、タイムスタンプによって並べ替えられるため、すべてがはるかに簡単になります。できれば両方できるといいのですが、私が言ったように、本当によくわかりません。

ステートメントの基本的な概要は、長くなりますが簡略化されています。

SELECT N.article,  N.ID, A.ID, A.name,a.url, N.timestamp
FROM news N
LEFT JOIN artists A ON N.ID = A.ID
WHERE N.ID = A.ID
ORDER BY N.timestamp DESC
LIMIT 10

メンバー テーブル;

CREATE TABLE `members` (
`ID` int(111) NOT NULL AUTO_INCREMENT,
`email` varchar(100) COLLATE latin1_general_ci NOT NULL,
`password` varchar(100) COLLATE latin1_general_ci NOT NULL,
`FNAME` varchar(100) COLLATE latin1_general_ci NOT NULL,
`SURNAME` varchar(100) COLLATE latin1_general_ci NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=5 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=4 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci

各テーブルに対してmysqlクエリを使用し、すべてを配列に入れてエコーアウトする前に。これは長くて面倒に思えたので、うまくいきませんでした。1週間ほど前だったので、そのコードをすべて削除しました。

これを深く掘り下げる必要があるとは思わないでください。私を正しい方向に向けるだけです。

添加:

これは、提案されたトリガーに対して作成したSQLクエリです。以前にトリガーを使用したことがないため、何が問題なのかわかりません。トラックに何かを挿入すると、このエラーが発生します

#1054 - Unknown column 'test' in 'field list' 

クエリの値は、現時点ではテスト用です

 delimiter $$

 CREATE

 TRIGGER tracks_event AFTER INSERT
 ON tracks FOR EACH ROW 

   BEGIN

INSERT into events(ID, action)
    VALUES (3, test);

   END$$
delimiter ;

アップデート!

提案どおりにイベントと呼ばれるテーブルを作成し、トリガーを使用して、いくつかのテーブルの1つに挿入した後に更新しました。

これが私が試したクエリですが、間違っています。クエリは、イベント テーブルで参照されている情報を他のすべてのテーブルから取得し、タイムスタンプで並べ替える必要があります。

SELECT T.url, E.ID, T.ID, E.action, T.name, T.timestamp
FROM tracks T
LEFT JOIN events E ON T.ID = E.ID
WHERE T.ID = E.ID
ORDER BY T.timestamp DESC

そのクエリでは、問題がまだ残っているため、簡単にするためにイベントとトラックのテーブルのみを含めました。さらに多くのテーブルが存在するため、問題は悪化します。

問題を説明するのは難しいですが、基本的にすべてのテーブルに ID があり、1 つの ID で複数のアクションを実行できるため、アクションが誤った結果 (この場合は url) で表示される可能性があります。

イベント テーブルとトラック テーブルの内容を説明し、さらに説明するために結果を示します。

イベント テーブル。

      4 has uploaded a track.
      3 has some news.
      4 has become an NBS artist.

トラックで。

      2 uploads/abc.wav Cannonballs & Stones    2012-08-20 23:59:59 1
      3 uploads/19c9aa51c821952c81be46ca9b2e9056.mp3    test    2012-08-31 23:59:59 2
      4 uploads/2b412dd197d464fedcecb1e244e18faf.mp3    testing 2012-08-31 00:32:56 3
      4 111 111111  0000-00-00 00:00:00 111111

クエリの結果。

uploads/19c9aa51c821952c81be46ca9b2e9056.mp3    3   3   has some news.  test    2012-08-31 23:59:59    
uploads/2b412dd197d464fedcecb1e244e18faf.mp3    4   4   has uploaded a track.   testing 2012-08-31 00:32:56
uploads/2b412dd197d464fedcecb1e244e18faf.mp3    4   4   has become an NBS artist.   testing 2012-08-31 00:32:56
111 4   4   has become an NBS artist.   111111  0000-00-00 00:00:00
111 4   4   has uploaded a track.   111111  0000-00-00 00:00:00

ご覧のとおり、クエリは望ましくない結果をもたらします。各 ID のアクションは各 URL で指定されるため、URL が複数回表示され、間違ったアクションで表示される可能性があります。そのクエリにはトラック テーブルしかないため、表示したい唯一のアクションは「トラックをアップロードしました」です。

4

1 に答える 1

2

スキーマの完全な詳細がなければ、必要なステートメントを提供することは困難です。たとえば、質問はニュース テーブルとアーティスト テーブルを参照していますが、それらのスキーマを提供していないか、それらの参照を含むステートメントが質問で言及されている他のテーブルとどのように関連しているかを示していません。

それでも、特にさまざまなテーブルのそれぞれに共通のフィールドがある場合は、楽しい PHP トリックを使用せずに、MySQL で完全に実行できると思います。

しかし最初に: これはあなたが本当に望んでいる答えではないかもしれませんが、さまざまなテーブルでトリガーを使用して「イベント フィード」テーブルを更新することが最善の解決策である可能性があります。つまり、「ステータス」テーブルで挿入または更新が発生した場合、「イベント フィード」テーブルに人物の ID とアクションのタイプを挿入するトリガーをステータス テーブルに設定します。同じデータ型の異なるイベントを示すために、個別の挿入トリガーと更新トリガーを使用できます。

イベント フィード テーブルから直接選択するだけなので、イベント フィードを作成するのは非常に簡単です。

create トリガーの構文を確認してください。

そうは言っても、 CASEキーワードとUNIONキーワードを見たことがあると思います。

次に、すべてのテーブルからデータを取得し、何かを示す文字列を出力するクエリを作成できます。次に、そのクエリをビューに変換し、それを「イベント フィード」テーブルとして使用して、直接選択することができます。

メンバーのリスト (実際に行っています) と、それらのメンバーからのアクション (つまり、トラック、ステータス、写真、ビデオ) を含むさまざまなテーブルがあり、すべてメンバー テーブルを指すキーを持っているとします。アクティビティのリストを生成するためにメンバーから選択する必要はありません。UNION特定のイベントを持つテーブルをまとめることができます。

SELECT
    events.member_id
  , events.table_id
  , events.table
  , events.action
  , events.when_it_happened
  , CASE
      WHEN events.table = "tracks" THEN "Did something with tracks"
      WHEN events.table = "status" THEN "Did something with status"
    END
    AS feed_description
FROM (
  SELECT
      tracks.ID AS member_id
    , tracks.track_ID AS table_id
    , "tracks" AS table
    , CONCAT(tracks.url, ' ', tracks.name) AS action
    , tracks.timestamp AS when_it_happened
  ORDER BY tracks.timestamp DESC
  LIMIT 10

  UNION

  SELECT
      status.ID as member_id
    , status.status_id AS table_id
    , "status" AS table
    , status.value AS action
    , status.timestamp AS when_it_happened
  ORDER BY status.timestamp DESC
  LIMIT 10

  UNION
  ...

) events
ORDER BY events.when_it_happened DESC

イベントを生成するよりも頻繁にフィードを照会する方がパフォーマンスが大幅に向上するため、トリガーによって作成されたフィード テーブルを作成する方がよいと思います。

于 2012-08-19T03:00:57.113 に答える