2016-10-16 16 views
7

編集:これを複数のクエリを使用してPHPを使用して結合する方法があると思うので、これをPHPカテゴリとMySQLカテゴリの両方に入れました。私はむしろこれをしないだろう...しかし、終わりには、解決策は解決策です...MySQL別のテーブルのタイムスタンプに基づいて情報を選択する

これはうまくいけば誰かが考えることができますが、私は確かにここにこだわっています!私のサイトでは、ユーザーがフィード/メッセージを投稿できるようにしています。メンバーシップの切り替えは、できるだけ頻繁に行うことができます。現在のメンバーシップだけでなく、各フィードを投稿したメンバーシップに基づいていくつかの統計を実行したいと思います。たとえば、各メンバーシップによって投稿されたフィードの数を確認したいと思います。今、カウントを実行してユーザー、フィード、メンバーシップの表に参加できますが、これは各ユーザーの現在のメンバーシップに基づいて各フィードをカウントします。私はこれが理にかなってほしい。

私たちのDBには既に多くのフィードがあるので、投稿したユーザーがどのメンバーシップタイプであるかを示す列をフィードテーブルに追加できません。ここでは誰もがこれを行う方法のクエリのアイデアを持っているかどうかを確認するためにどのように見えるか、私のテーブル(省略)である:

ユーザー表

id username membershipid 
1 John Doe 1 

メンバーシップ表に

id membershipname 
1 Membership #1 
2 Membership #2 
3 Membership #3 

メンバーシップ履歴テーブルを

id membershipsid usersid unix_timestamp 
1 1    1  1476635544.33 
2 2    1  1476641890.11 
3 3    1  1476642124.2 
4 1    1  1476642161.51 

フィードテーブル

id unix_timestamp  usersid 
1 1476641716.809361 1 
2 1476641783.866863 1 
3 1476641822.779324 1 
4 1476641904.066237 1 
5 1476641973.767174 1 
6 1476642182.821472 1 

unix_timestampsをすばやく確認することは困難である...しかし、私は希望することは、この提供するソリューションのためである:、これまでメンバーシップ表で

membershipid feedcount 
1    4 
2    2 
3    0 

送り回数を私は多くのことを試してみましたが、それらはすべてのような...ユーザーが持っている現在のメンバーシップを提供し終わる:

SELECT 
    a.MembershipName MembershipName, 
    COUNT(*) Feeds 
FROM (SELECT 
     m.membership_name MembershipName 
    FROM feeds f 
    JOIN users u ON f.usersid = u.id 
     JOIN memberships m ON u.membership_id = m.id 
    GROUP BY f.id 
    ORDER BY f.unix_timestamp DESC) a 
    GROUP BY a.MembershipName 
ORDER BY a.MembershipName 

しかし、これはメンバーと何もしません船履歴テーブル、私の出力テーブルがあるので:

送り回数会員テーブルによって

membershipid feedcount 
1    6 
2    0 
3    0 

示されるように、それは1-> 4、2-> 2 & 3-> 0でなければならないように、間違っています上記の表の誰のアイデアですか?

+0

似たような状況ます。http:/ /stackoverflow.com/questions/4070476/sql-query-to-join-two-tables-based-off-closest-timestamp#彼らの 'classification'テーブルはあなたのメンバーシップ履歴テーブルとなり、' closed_cases'テーブルはあなたのフィードテーブル – Terminus

+0

それはかなり似た質問です...私はそれをまったく複製することができるかどうか見ていきます。私が実行している1つの問題は、彼のソリューションは「エンドタイム」の新しい列を追加することで解決したということです。メンバーシップの履歴テーブルでこのユーザーの次の値になります。 –

答えて

1

ノート#1 - あなたが実行するクエリは、私のアドバイスは、単に供給が

ノート#2を掲載された時点でフィードテーブルに現在membershipsidを保存することで、非常に高価です - 以下のクエリでは、メンバーシップ履歴には、変更されたときだけでなく、履歴レコードが作成されたときにユーザーごとに少なくとも1つのエントリが常に含まれていることが前提です。

時刻XでメンバーシップIDの値をクエリしますか?「答えは簡単です、それは時間のX前に最新の変更された値である:

SELECT h.membershipsid 
FROM membershipshistory h 
WHERE h.usersid = {USERID} AND h.unix_timestamp < {X} 
ORDER BY h.unix_timestamp DESC 
LIMIT 1 

次の事はある、」私はXはフィードがいた時である会員のIDと一緒にすべてのフィードのリストを表示するにはどうすればよいです投稿された?あなたのソリューションは、些細なことばかりhistorical_membershipsidによってビューまたはサブクエリとグループ全体のクエリを入れて、それを覚えておく必要があり、この1から

+------+---------+--------------------------+ 
| id | usersid | historical_membershipsid | 
+------+---------+--------------------------+ 
| 1 |  1 |      1 | 
| 2 |  1 |      2 | 
| 3 |  1 |      3 | 
+------+---------+--------------------------+ 

:(私のサンプルデータからの)出力

SELECT 
    feeds.id, 
    feeds.usersid, 
    (
    SELECT h.membershipsid 
    FROM membershipshistory h 
    WHERE h.usersid = feeds.usersid AND h.unix_timestamp < feeds.unix_timestamp 
    ORDER BY h.unix_timestamp DESC 
    LIMIT 1 
) AS historical_membershipsid 
FROM 
    feeds 

非常に高価です。最終的な解決策がその明白でなかった場合、私は謝罪

UPDATE

は、ここでは過去のデータを利用して、会員ごとにフィードをカウントするための最後のクエリです:あなたへ

SELECT 
    hf.historical_membershipsid AS membershipsid, 
    COUNT(hf.id) AS feedcount 
FROM (
    SELECT 
    feeds.id, 
    feeds.usersid, 
    (
     SELECT h.membershipsid 
     FROM membershipshistory h 
     WHERE h.usersid = feeds.usersid AND h.unix_timestamp < feeds.unix_timestamp 
     ORDER BY h.unix_timestamp DESC 
     LIMIT 1 
    ) AS historical_membershipsid 
    FROM 
    feeds) AS hf 
GROUP BY 
    hf.id 
+0

オクラホマ...私はいくつかの外観を取って、あなたの提案で少し演奏しました。私はあなたがどこに行くのか見ることができますが、これは非常に高価であることに私は同意します。もっとシンプルな方法が必要だと私は信じています。あなたの提案での1つの質問は、どのように取得しているのか... 'h.usersid = {USERID}とh.unix_timestamp <{X}' ...実際にforループを持たずに正しいuseridを取得する方法がわかりませんそれはすべてのユーザーに行き渡り、それぞれのユーザーに対してこれを実行します。おそらく私は誤解しているかもしれません。 –

+0

2番目のスニペットでは、フィールドサブセレクトとして最初のクエリを使用しています。これは、フィードテーブルの各行に対してサブクエリが評価され、現在のユーザーIDで「feeds.usersid」を置き換えるたびに評価されることを意味します。 – Johnny

+0

ああ、もちろん。私は十分に大きな絵を見ていませんでした。私は今それを見ることができます。申し訳ありません...私は再びそれを見ています –

関連する問題