编写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'时才相等。
我需要根据最近的活动来排序结果获得评论