编写mysql查询的想法

编写mysql查询的想法,mysql,sql,wordpress,Mysql,Sql,Wordpress,我有一个名为wp\u bp\u activity的表,其中有许多列,我认为我应该使用其中的4个来解决这个问题:id,type,item\u id和date\u recorded 1-当有人发布新活动时,类型为activity\u update,item\u id为0 2-当有人在活动上发布新评论时,其类型为activity\u comment,item\u id为id列中存在的活动id 3-在这两种情况下,date\u recorded是插入数据的日期 表中还有更多的types 但我只想获取最近

我有一个名为
wp\u bp\u activity
的表,其中有许多列,我认为我应该使用其中的4个来解决这个问题:
id
type
item\u id
date\u recorded

1-当有人发布新活动时,
类型为
activity\u update
item\u id
0

2-当有人在活动上发布新评论时,其
类型为
activity\u comment
item\u id
id列中存在的活动id

3-在这两种情况下,
date\u recorded
是插入数据的日期

表中还有更多的
type
s

但我只想获取最近有人回复的
类型为
活动更新的
行或是新的行(我认为基于
记录的日期)

我试过的是:

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

我希望此表中的哪些行是按此顺序排列的ID:

12079
12080
我不想得到的:

12079
12080
活动\u注释
类型

行的提取顺序是什么?

如您所见,带有
activity\u comment
类型的行有一个
item\u id
,其值为
12079
。因此,
12079
是最近有人对此发表评论的最新活动,
12080
没有评论,只是刚刚发布。所以我两个都要,但顺序如下:

12079
12080

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

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

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

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

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

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

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

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

您应该再添加一个字段

id, type, item_id, commented_on, date_recorded
::->>评论
将证明
项目id
评论
,这里是12080的12079条评论,因此您可能很容易得到想要的东西

因此,您的结构应该如下所示:

   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

您应该再添加一个字段

id, type, item_id, commented_on, date_recorded
::->>评论
将证明
项目id
评论
,这里是12080的12079条评论,因此您可能很容易得到想要的东西

因此,您的结构应该如下所示:

   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

您应该再添加一个字段

id, type, item_id, commented_on, date_recorded
::->>评论
将证明
项目id
评论
,这里是12080的12079条评论,因此您可能很容易得到想要的东西

因此,您的结构应该如下所示:

   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

您应该再添加一个字段

id, type, item_id, commented_on, date_recorded
::->>评论
将证明
项目id
评论
,这里是12080的12079条评论,因此您可能很容易得到想要的东西

因此,您的结构应该如下所示:

   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

也许我错过了一些重要的东西,但这有什么不对

SELECT *
FROM `wp_bp_activity`
WHERE `type`='activity_update'
ORDER BY `date_recorded` ASC
LIMIT 0, 20;

也许我错过了一些重要的东西,但这有什么不对

SELECT *
FROM `wp_bp_activity`
WHERE `type`='activity_update'
ORDER BY `date_recorded` ASC
LIMIT 0, 20;

也许我错过了一些重要的东西,但这有什么不对

SELECT *
FROM `wp_bp_activity`
WHERE `type`='activity_update'
ORDER BY `date_recorded` ASC
LIMIT 0, 20;

也许我错过了一些重要的东西,但这有什么不对

SELECT *
FROM `wp_bp_activity`
WHERE `type`='activity_update'
ORDER BY `date_recorded` ASC
LIMIT 0, 20;

我假设您正在查找“最近的条目”(
WHERE type='activity\u update'和date\u recorded>[threshold]
)和“具有最近回复的条目,无论条目的年龄如何”(
WHERE reply.type='activity\u comment'和reply.date\u 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

我并不为我的“按顺序排列”条款表现不佳而感到自豪,我希望有人能提出更好的建议

我假设您正在寻找“最近的条目”(
其中type='activity\u update'和date\u recorded>[threshold]
)和“具有最近回复的条目,无论条目的年龄如何”(
其中reply.type='activity\u comment'和reply.date\u recorded>[阈值]

第一组很简单:

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

我并不为我的“按顺序排列”条款表现不佳而感到自豪,我希望有人能提出更好的建议

我假设您正在寻找“最近的条目”(
其中type='activity\u update'和date\u recorded>[threshold]
)和“具有最近回复的条目,无论条目的年龄如何”(
其中reply.type='activity\u comment'和reply.date\u recorded>[阈值]

第一组很简单:

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

我并不为我的“按顺序排列”条款表现不佳而感到自豪,我希望有人能提出更好的建议

我假设您正在寻找“最近的条目”(
其中type='activity\u update'和date\u recorded>[threshold]
)和“具有最近回复的条目,无论条目的年龄如何”(
其中reply.type='activity\u comment'和reply.date\u recorded>[阈值]

第一组很简单:

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

我并不为我糟糕的
orderby
子句感到自豪,我希望有人能建议一个更好的主意

在你的查询中,所有的结果都必须有
b.item=a.id
但是在我的查询中,
b.item=a.id
应该只在
b.type='activity\u comment'时才相等。
我需要根据最近的活动来排序结果获得评论