0

我有一个以wp_bp_activity许多列命名的表,我认为我应该使用其中的 4 个列来解决这个问题:idtype和.item_iddate_recorded

1 -当有人发布新活动typeactivity_updateitem_id0

2 -当有人对某项活动发表新评论时,它在列中type存在activity_comment并且item_id存在活动 IDid

3 -在两者中,date_recorded是插入数据的日期。

表中还有更多type的s。

但我只想获取某人最近回复type新的行(基于我认为)activity_updatedate_recorded

我试过的是:

SELECT  a.*, b.*
FROM wp_bp_activity as a, wp_bp_activity as b
WHERE
  ((b.type = 'activity_update') OR (b.type = 'activity_comment' AND b.item_id = a.id))
order by cast(a.date_recorded as datetime) desc
limit 0,20

这需要很长时间才能执行并以内存不足错误结束。

感谢您对此类查询的任何帮助。

更新#1

                        wp_bp_activity table

    id              type             item_id         date_recorded
|---------|-----------------------|-----------|--------------------------
|  12081  |   activity_comment    |   12079   |    2013-10-18 07:27:01
|---------|-----------------------|-----------|--------------------------
|  12080  |   activity_update     |     0     |    2013-10-18 07:26:40
|---------|-----------------------|-----------|--------------------------
|  12079  |   activity_update     |     0     |    2013-10-17 05:15:43

我想从这个表中得到哪些行是这些 id,按以下顺序:

12079
12080

我不想得到的:

activity_comment类型

行应该按什么顺序获取?

如您所见,activity_comment类型为的行item_id的值为1207912079最近有人对其发表评论的最新活动也是如此,并且没有12080评论但刚刚发布。所以我想要两者,但按以下顺序:

12079
12080
4

4 回答 4

1

您应该再添加一个字段

id, type, item_id, commented_on, date_recorded

::->> commented_on将证明对 的item_id评论是合理的commented_on,这里有 12079 对 12080 的评论,所以你可能很容易得到你想要的

所以你的结构应该是这样的:

   id             type            commented_on   item_id         date_recorded
|---------|-----------------------|-----------|-----------|--------------------------
|  12081  |   activity_comment    |   12080   |   12079   |    2013-10-18 07:27:01
|---------|-----------------------|-----------|-----------|--------------------------
|  12080  |   activity_update     |     0     |     0     |    2013-10-18 07:26:40
|---------|-----------------------|-----------|-----------|--------------------------
|  12079  |   activity_update     |     0     |     0     |    2013-10-17 05:15:43
于 2013-10-18T04:20:06.910 回答
1

我将假设您正在寻找“最近的条目”(WHERE type = 'activity_update' AND date_recorded > [threshold])和“具有最近回复的条目,无论条目的年龄如何”(WHERE reply.type = 'activity_comment' AND reply.date_recorded > [threshold])。

第一组很简单:

SELECT entries.*
FROM activity AS entries
WHERE type = 'activity_update' AND date_recorded > [threshold]

第二组不太明显:

SELECT entries.*
FROM activity AS entries
JOIN activity AS replies
    ON replies.item_id = entries.id
    AND replies.type = 'activity_comment'
WHERE
    entries.type = 'activity_update'
    AND replies.date_recorded > [threshold]

把它们放在一起:

SELECT entries.*
FROM activity AS entries
LEFT JOIN activity AS replies -- LEFT JOIN, because an INNER JOIN would filter out entries without any reply
    ON  replies.item_id = entries.id
    AND replies.type = 'activity_comment'
WHERE
    entries.type = 'activity_update'
    AND (
        entries.date_recorded > [threshold]
        OR replies.date_recorded > [threshold] -- evaluates as FALSE if replies.date_recorded is NULL
    )
ORDER BY IFNULL(replies.date_recorded, entries.date_recorded) -- replies if not null, entries otherwise

我并不为我表现不佳的ORDER BY条款感到自豪,我希望有人能提出一个更好的主意

于 2013-10-18T15:37:39.990 回答
1

也许我错过了一些巨大的东西,但有什么问题吗?:

SELECT *
FROM `wp_bp_activity`
WHERE `type`='activity_update'
ORDER BY `date_recorded` ASC
LIMIT 0, 20;
于 2013-10-18T13:20:49.940 回答
0

您在 OR 子句中有您的 JOIN 条件。这是一个很好的例子,说明了为什么你不应该使用这种语法。

SELECT  a.*, b.*
FROM wp_bp_activity as a JOIN wp_bp_activity as b ON b.item_id = a.id
WHERE
  ((b.type = 'activity_update') OR (b.type = 'activity_comment'))
order by cast(a.date_recorded as datetime) desc
limit 0,20
于 2013-10-17T20:05:39.130 回答