2016-07-28 37 views
5

我正在嘗試SELECT尚未被某個用戶(user-id:uid)所喜歡或不喜歡的隨機頁面。排除特定的SQL列嗎?

我的表結構:

OneNight_pages:(ID,標題)OneNight_pages_likes:(ID,PAGE_ID,UID狀態)

這就是我如何試圖得到一個隨機頁面:

SELECT 
p.id AS page_id, 
p.title, 
SUM(CASE WHEN l.page_id = p.id AND status = '1' THEN 1 ELSE 0 END) AS likes, 
SUM(CASE WHEN l.page_id = p.id AND status = '0' THEN 1 ELSE 0 END) AS dislikes 

FROM OneNight_pages_likes l 
LEFT JOIN OneNight_pages p on l.page_id = p.id 
WHERE l.uid != '1' 
GROUP BY page_id 
ORDER BY rand() 
LIMIT 1 

但是,這仍然會顯示我已經喜歡或不喜歡的頁面,因爲WHERE l.uid != 1不會影響排除整個l.page_id(因爲對於特定的page_i,還有其他類似的和不喜歡的人) d)。

我想我需要解決這個與子查詢首先接收頁面ID或使用一些特定的算法?我還想過將所有喜歡和不喜歡的頁面作爲數組存儲在cookie或會話中,但我不知道這是否是正確或有效的方式?

+0

你能提供樣本數據和預期結果嗎?難以理解... – sgeddes

回答

4

這是你想要的嗎?

select p.* 
from OneNight_pages p 
where not exists (select 1 
        from OneNight_pages_likes l 
        where l.page_id = p.id and l.uid = '1' 
       ) 
order by rand() 
limit 1; 

這將選擇一個隨機頁面,用戶「1」在類似表格中沒有行。

編輯:

上查詢這種變化應該做的是同一件事:

SELECT p.id AS page_id, p.title, 
     SUM(CASE WHEN status = '1' THEN 1 ELSE 0 END) AS likes, 
     SUM(CASE WHEN status = '0' THEN 1 ELSE 0 END) AS dislikes 
FROM OneNight_pages p LEFT JOIN 
    OneNight_pages_likes l 
    ON l.page_id = p.id 
GROUP BY page_id 
HAVING SUM(l.uid = 1) = 0 
ORDER BY rand() 
LIMIT 1; 

以前的版本應該有更好的表現。

+0

謝謝您的回覆。這似乎只顯示現在還沒有被人喜歡的頁面。因此,我只能獲得沒有任何喜歡或不喜歡的網頁,而不是隻排除一個特定的用戶? – AlexioVay

+1

@Vaia。 。 。這應該只排除一個特定用戶的喜好。 –

+1

你是對的,謝謝!我使用了'l.uid!='1''而不是'l.uid ='1'' – AlexioVay