2013-10-15 25 views
0

我有一個名爲wp_bp_activity具有很多列,我認爲我應該與他們的4個工作這個問題表:idtypeitem_iddate_recorded理念的寫作MySQL查詢

1 -當有人張貼了新的活動typeactivity_updateitem_id0

2 -當有人發表新評論它typeactivity_commentitem_id在存在活動ID活動列id

3 -在兩者中,date_recorded是數據插入的日期編輯。

還有更多type S IN表。

但是我想(在date_recorded我認爲基於)

這點我嘗試提取只與activity_updatetype行某人最近回覆是新的是:

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與值12079。所以12079是,最近有人對其提出評論最新的活動,並12080沒有評論,但剛剛發佈。所以我希望兩個,但在這個順序:

12079 
12080 
+0

沒有helppppppppppppp – revo

+0

請revo,看我的更新... :) –

+0

我的主要問題是你有沒有添加體面的索引到表? :) – Brian

回答

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條款,我希望有人可以建議更好想法

+0

作品!但問題是結果有重複行,如果我使用'不同的條目。*'結果將有所不同! – revo

+1

最後只需改變順序依次爲:GROUP BY entries.id ORDER BY IFNULL(max(answers.date_recorded),entries.date_recorded)desc –

+0

還要確保您具有良好的連接和排序索引。 –

0

你有你的聯接條件的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 
+0

在您的查詢中,所有結果必須包含'b.item = a.id',但是在我的'b.item = a.id'應該僅當'b.type ='activity_comment'' – revo

+0

需要訂購時結果基於最近得到評論或發佈的活動。但通過這種方式,他們是通過ID命令的! – revo

+0

Andy請參閱更新。我在某種程度上讓我的解釋更容易。 – revo

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 
+0

Krunal您能否看到我的更新?謝謝 – revo

+0

我使用buddypress,所以我不能做硬編碼。不管怎麼說,還是要謝謝你! – revo

+0

你不需要任何硬編碼在這裏,你必須只創建從phpMyAdmin的一個領域,需要一分鐘。並且比它容易引發查詢。 –

1

也許我失去了一些東西,但龐大的有什麼錯?:剛剛

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