2012-12-14 71 views
-1

我有一個包含多個內容類型和用戶的數據庫,以及一個包含likes的獨立數據庫。我試圖找出哪些用戶收到了他們最喜歡的任何的內容,無論是哪種類型。使用GROUP BY和ORDER BY與多個INNER JOIN

我已經能夠找出查找特定內容類型找到最喜歡的用戶的查詢,但與任何內容類型被證明是有點困難。

可能值得注意的是,該數據庫中有數百萬條記錄。

以下是我一直在創建查詢時所做的工作......我非常確定這是不正確的!

SELECT picture.user_id, video.creator_id, post.author_id 
FROM likes_service.likes 
INNER JOIN prod.pictures picture ON likes.obj_id = picture.id 
INNER JOIN prod.videos video ON likes.obj_id = video.id 
INNER JOIN prod.posts post ON likes.obj_id = post.id 
GROUP BY picture.user_id, video.creator_id, post.author_id 
ORDER BY COUNT(picture.user_id), COUNT(video.creator_id), COUNT(post.author_id) DESC 
LIMIT 20; 

有沒有人請給我一個提示或指向正確的方向?我覺得我正在接近...

謝謝!

+1

爲什麼你的名字與同標號的三個不同的瓦爾? – Rubens

+0

您不應該選擇不在您的聚合中的列。 – Kermit

+0

@njk你是什麼意思? –

回答

2

我想你想要一個UNION,而不是一個多路JOIN。

select objects.user_id user_id, sum(likes.like_count) like_count 
from (
    select user_id, id 
    from prod.pictures 
    union all 
    select creator_id, id 
    from prod.videos 
    union all 
    select author_id, id 
    from prod.posts) objects 
join (select obj_id, count(*) likes_count 
     from likes_service.likes 
     group by obj_id) likes on likes.obj_id = objects.id 
group by user_id 
order by like_count desc 
+0

我已添加查詢。 – Barmar

+0

這指出了您的數據庫設計可能存在的問題。如果有關於文檔的所有類型不可知信息(例如作者)的單個表,並且引用特定於類型的表,那將會更好。 – Barmar

+0

當我嘗試使用您的示例運行它時,出現:ERROR 1052(23000):字段列表中的列'user_id'不明確。值得注意的是,我也在類似的表中有一個user_id字段。 –

1

它,如果你想擁有與上市最喜歡的對象,或者你是否正在尋找具有分佈在其所有的內容最全面喜歡的用戶的用戶目前尚不清楚。

考慮一個用戶只有一張擁有1000個喜歡的照片,如果該用戶在總共100張照片,用戶總數爲100張照片,視頻和帖子的平均喜歡數爲20的用戶之前列出, 50?

這些是兩個不同的查詢。

現在,我將假設你想要找到的是「最喜歡的」項目,然後找出哪些用戶是由哪些用戶創建/創作的。要找到20個「最喜歡」的項目,這是非常簡單的尋找一種「obj_id」 S擁有最喜歡...

SELECT l.obj_id 
    , COUNT(1) AS like_count 
    FROM likes_service.likes l 
GROUP BY l.obj_id 
ORDER BY like_count DESC 
LIMIT 0,20 

我假設(基於原始查詢),並沒有一個明確的方案和樣本數據,likes表中的obj_id的值引用其他表中的單個對象的值id ...即,obj_id值不會出現在photosvideos表中。 (否則,你可能有一列的地方旁邊obj_id告訴你obj_id被引用的表。)

我們使用以前的查詢作爲內嵌視圖(MySQL調用它派生表),並給它一個方便的「ml」別名(最喜歡),我們將對每個目標對象表(照片,視頻,帖子)進行左連接,找出它是什麼類型的項目,以及誰是用戶/創作者/作者是。

SELECT ml.obj_id 
    , ml.like_count 
    , p.user_id 
    , v.creator_id 
    , t.author_id 
    FROM (SELECT l.obj_id 
       , COUNT(1) AS like_count 
      FROM likes_service.likes l 
      GROUP BY l.obj_id 
      ORDER BY like_count DESC 
      LIMIT 0,20 
     ) ml 
    LEFT 
    JOIN prod.pictures p 
    ON p.id = ml.obj_id 
    LEFT 
    JOIN prod.videos v 
    ON v.id = ml.obj_id 
    LEFT 
    JOIN prod.videos v 
    ON v.id = ml.obj_id 
    LEFT 
    JOIN prod.posts t 
    ON t.id = ml.obj_id 
ORDER BY ml.like_count DESC 

假設從照片表user_id列是NOT NULL,且creator_id from the videos`表NOT NULL ...

然後你就可以判斷obj_id在發現哪個表。即如果user_id列不爲空,則您知道它來自照片表格,如果creator_id不爲空,則您從視頻表格中知道它。

你可以添加在一些表情最外層選擇破譯......

SELECT CASE WHEN p.user_id IS NOT NULL THEN 'photo' 
      WHEN v.creator_id IS NOT NULL THEN 'video' 
      WHEN t.author_ID IS NOT NULL THEN 'post' 
     END AS obj_type 
    , CASE WHEN p.user_id IS NOT NULL THEN p.user_id 
      WHEN v.creator_id IS NOT NULL THEN v.creator_id 
      WHEN t.author_id IS NOT NULL THEN t.author_id 
     END AS user_id 
    , l.obj_id