0

私は非常に奇妙なことをしなければならず、単に方法がわかりません。これは私のテーブルとそのデータです:

+------+-----------+-------------+-------+------------+
| uid  | entity_id | entity_type | state | created    |
+------+-----------+-------------+-------+------------+
| 3913 |      1105 |           1 |     0 | 1340617072 |
| 3913 |      1105 |           1 |     1 | 1340617042 |
| 3913 |      3930 |           1 |     0 | 1340617071 |
| 3913 |      3930 |           1 |     1 | 1340617036 |
+------+-----------+-------------+-------+------------+

createdアクションが行われたタイムスタンプを保持し、アクションstateの状態 (フォローされているかフォローされていないか) でuidあり、アクションを行った人物でありentity_id、フォローされている/フォローされていないエンティティ ID です。

entity_id現在のユーザーがフォローしているすべてのものを取得するクエリを実行しようとしています。最初に私が使用していた:

SELECT entity_id FROM follow_objects WHERE uid=? AND entity_type=?

ただし、誰かをフォローしてからフォローを解除しても、その人の結果が得られることに気付きました。これは、2 つのエントリ (状態 = 1 と状態 = 0) があるためです。

したがって、最新の列を持つ行を取得する必要がありcreatedます。つまり、アクションは最新のものです。だから私は試しました:

SELECT entity_id FROM follow_objects WHERE uid=? AND entity_type=? group by entity_id HAVING created=MAX(created)

ごみデータのみを返します。私はアイデアがありません。何か助けはありますか?

4

2 に答える 2

1

グループごとの最大値を選択する必要があります。entity_id副選択で最大値をラップし、 s が等しく、副選択の最大タイムスタンプが作成されたタイムスタンプと等しいテーブル自体に結合する必要があります。entity_idその結果、グループごとに一番上の行のデータが得られます。

SELECT
    a.entity_id,
    b.state,
    b.created
FROM
    (
        SELECT entity_id, MAX(created) AS max_created
        FROM follow_objects
        WHERE uid = ? AND entity_type = ?
        GROUP BY entity_id
    ) a
INNER JOIN
    follow_objects b ON
        a.entity_id = b.entity_id AND
        a.max_created = b.created
于 2012-06-25T09:53:05.743 に答える
0

一致するすべての行を最初に選択し、作成日(最新)で並べ替えてから、その結果から最初の行を取得します。

SELECT entity_id
FROM (
    select entity_id, created
    from follow_objects
    WHERE uid=?
    AND entity_type=?
    order by created desc
) x
limit 1

理解しやすく、コーディングも簡単です。

fyi、から選択したすべての結果セットにエイリアスを指定する必要があるため、角かっこの後の「x」があります。そのため、これを「x」と呼びました。

于 2012-06-25T09:58:43.260 に答える