2011-06-06 41 views
1

我會很感激你的幫助,這個請:幫助上一個棘手的MySQL查詢

我有哪些日誌表時的用戶(id_user),其中在一個事件(會議,演唱會..)(id_event )和他的這個事件的分數(長篇故事)。這裏是我的表:

CREATE TABLE `Leaderboards` (
    `id` mediumint(9) NOT NULL AUTO_INCREMENT, 
    `id_event` mediumint(8) NOT NULL, 
    `user_id` mediumint(9) NOT NULL, 
    `score` smallint(4) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 

現在,我想建議給用戶的所有已在至少一個公共事件的用戶,並已到了很多事件的用戶對其進行排序共同。

我可能有一個想法,在一行請求後在PHP中做,但有沒有更直接通過MySQL更聰明的方法?

謝謝你的回答!

+0

不知道爲什麼這是倒投了,我認爲這是一個很好的問題。 – Zoidberg 2011-06-06 11:15:11

+0

一個簡短的總結:你想要一個顯示一個用戶(允許說user_id 100)所有其他用戶誰有一個事件(id_event)共同的查詢? 你說了很多...有多少?至少3或至少1? – FinchSol 2011-06-06 11:06:02

回答

3

我想我可能有一個答案給你

SELECT leader1.user_id, leader2.user_id, COUNT(leader1.id) AS num 
FROM  Leaderboards AS leader1 
INNER JOIN Leaderboards AS leader2 ON (
    leader1.id_event = leader2.id_event AND 
    leader1.user_id != leader2.user_id 
) 
GROUP BY leader1.user_id, leader2.user_id 
ORDER BY num DESC 

這將選擇用戶的ID誰在至少一個公共事件,以及事件的數量。最後它會按共同事件的數量(數量)降序排列。如果你想做到這一點對一個特定的用戶,添加在where子句中,例如下面

WHERE leader1.user_id = :user_id 

我也相信這個查詢,如果非常有效的爲好。讓我知道這是不是你所需要的,我會看看我是否可以做出調整。

+0

感謝Salman的縮進,我有時會在這裏發帖時忘記這麼做。 – Zoidberg 2011-06-06 11:18:58

+0

我會嘗試這一個,看看結果和perfs!我會告訴你,謝謝你的回答! – guillaumepotier 2011-06-06 12:04:12

+0

完美。沒什麼可說的。即使有另一個INNER JOIN來檢索用戶名,它也是非常快的:) – guillaumepotier 2011-06-06 14:00:48

2

對於用戶#1234

SELECT user_id, COUNT(1) 
FROM Leaderboards 
WHERE user_id <> 1234 
AND id_event IN (
     SELECT id_event FROM Leaderboards WHERE user_id = 1234 
) 
GROUP BY user_id 
ORDER BY COUNT(1) DESC 
+0

這不會按最常見的事件排序嗎? – dynamic 2011-06-06 11:01:51

+0

不確定是否需要。但是這與在group by子句中添加'id_event'一樣簡單。 – 2011-06-06 11:14:13

+0

當然它是必需的'並且通過很多常見事件的用戶對它進行分類'如果沒有它,太容易了 – dynamic 2011-06-06 11:27:38

0

我覺得下面的查詢將是一個適合:

select count(event) as event_count, user_id from 
    (select distinct id_event as event, 1 as left_userid from `Leaderboards` where user_id = 1) as leftbl, 
    Leaderboards 
where 
    event = Leaderboards.id_event AND 
    left_userid <> Leaderboards.user_id 
group by 
    user_id 
order by 
    event_count desc 

第一子選擇確定給定用戶的所有獨特的事件(在這種情況下,1),然後加入本品與Leaderboards表。其餘部分由用戶統計事件和分組。

+0

看起來不錯,但是我會在查詢的選擇部分謹慎選擇子查詢,這可能會導致加載時間過長。 – Zoidberg 2011-06-06 11:29:48

+0

如果你有一個關於用戶ID和事件ID的索引,它應該是快速的,因爲你可以散列選擇給定用戶的所有事件...... – grundprinzip 2011-06-06 12:31:58

0

我會去內部加入一個。據我所知,在服務器上造成的開銷較小,特別是在流行的Web應用程序/網站上考慮排行榜中的行數會很大。