主table
tbl_main
m_id int
m_label varchar
點擊率table
tbl_main_hits
mh_id int
mh_ip varchar
tbl_main_fk int (tbl_main的fk)
tbl_main_hits在網友點擊該頁面,根據規則過濾無誤後即儲存一筆資料
目前要撈出前10名的語法如下,資料正確無誤,但點擊率數量過多,光第一名已經COUNT將近10萬筆
所以撈取的速度有點慢,不知道有沒有別的作法可以達到相同的目的並且改善效能
SELECT m_id, m_label
FROM tbl_main
ORDER BY (SELECT COUNT(mh_id) FROM tbl_main_hits WHERE tbl_main_hits.tbl_main_fk = tbl_main.m_id) DESC LIMIT 0, 10
建議你稍微解釋一下tbl_main及tbl_main_hits的作用,我擔心會誤會你的意思。
我看到你這樣做,是想到tbl_main可能是一個模組名稱,tbl_main_hits中儲存的點擊資料是與他關聯的。
你的sql下的真的有點奇怪...這個用group by加上left join就可以阿,並不需要sub query。如果有速度問題先把where條件跟on條件會用到的欄位加上index,如果還沒效...那看看有沒有其他問題。
如果要用qileroro建議的方法,如果結果要精確,那操作上需要做lock table(假設你是用mysiam格式的資料表)。要用select ... for update的話(row lock),需要用innodb格式的資料表,而且要用transaction,比較麻煩一點。