2012-03-09 27 views
5

所以,我想我是在MySQL的獲得很不錯,直到我遇到了這個想法SELECT用戶:誰已經downvoted,但從來沒有upvoted

  • id:投票的唯一ID。
  • user:誰投
  • 的人的唯一的用戶ID
  • item:項目的ID他們正在
  • vote投票:他們投SET( '向上', '向下')
投票

現在,我試圖想出一種SQL方式來查找唯一投票聲音低的用戶。我知道有一種方法可以在查詢表中的大部分數據之後用程序化方式編寫它,但是當只有少數幾個查詢可以發現時,看起來確實非常低效。

理想情況下,我希望我的結果只是有0個upvotes的用戶列表(因爲在表中意味着他們已經投了票,所以他們只會downvote),也許他們投下的downvotes的數量。

任何想法,我應該如何處理這個?

+2

可能重複http://stackoverflow.com/questions/9626965/atleast-one-x-but-no- ys-query) – 2012-03-09 01:52:45

+0

哦,哇,非常相似,很好! – Tim 2012-03-09 02:01:14

+0

我對另一個問題留了言(我認爲這個問題有一個很好的答案,並且有點早),它需要一個更好,更有利於搜索引擎優化的標題。我不知道這會是什麼,本身,但我不認爲* [至少有一個X,但沒有Ys查詢](http://stackoverflow.com/questions/9626965/at-least-one-x -but-no-ys-query)*足以描述它的含義。 – 2012-03-09 02:06:42

回答

5
SELECT user, SUM(IF(vote='down',1,0)) AS numDownVotes 
FROM votes 
GROUP BY user 
HAVING SUM(IF(vote='up',1,0))=0 -- 0 upvotes 
    AND SUM(IF(vote='down',1,0))>0 -- at least 1 downvotes 

我不禁感到有一個整潔的GROUP BY user, vote辦法做到這一點雖然。

+0

輸出正是我所期待的。 – Tim 2012-03-09 02:06:21

+0

這非常漂亮,解決了無法匹配'ALIAS'用於子查詢的「WHERE」的「問題」。 – 2012-03-09 02:10:41

3
select user, count(user) 
from votes 
where user not in (
    select distinct user 
    from votes 
    where votes = 'up') 
+0

這可以計算每個用戶給出的積分數量;但是如果用戶同時投下了投票和最高投注,它仍然會包含他們(和他們的downvote總數)。 – 2012-03-09 01:42:35

+0

@ mathematical.coffee:你說得對。固定。 – Dinah 2012-03-09 01:52:51

+0

這很接近,但count(用戶)給出了錯誤的值(在本例中爲20而不是2)。 – Tim 2012-03-09 01:55:22

3

我沒有檢查語法什麼的,但這想到......

SELECT user 
FROM votes 
GROUP BY user 
    HAVING SUM(IF(vote = 'up', 1, 0)) = 0 
    AND SUM(IF(vote = 'down', 1, 0)) > 0 
+0

這個樣子非常有希望,但是有什麼方法可以確切地確定每個用戶投下多少次降價? – Tim 2012-03-09 01:57:27

+0

當然,你應該能夠將SUM(IF(vote ='down',1,0))AS DownVotes添加到列規範中。 – Martin 2012-03-09 02:40:02

0

在數據庫調用時出錯了嗎?喜歡的東西:

$query = "SELECT id FROM votes WHERE vote = 'down'"; 
$result = mysql_query($query); 
while ($rows = mysql_fetch_assoc($result)) 
{ 
$curID = $rows['id']; 
} 
+1

用戶可以有多張選票(表中的多個條目)。這個查詢爲每個投票返回一個記錄,而不是每個用戶,並且它也會返回投票了_anything_的用戶,即使他們投了其他東西。 – octern 2012-03-09 01:48:45

0
<?php 
// Make a MySQL Connection 

$query = "SELECT user, COUNT(user) FROM votes where vote == 'down' GROUP BY user"; 

$result = mysql_query($query) or die(mysql_error()); 

// Print out result 
while($row = mysql_fetch_array($result)){ 
    echo "User : ". $row['type'] ." has ". $row['COUNT(user)'] ." downvote/s."; 
    echo "<br />"; 
} 
?> 
1
select v.user from votes v where 
    0=(select count(a.vote) from votes a where a.user=v.user and a.vote='up' group by user) u 
and 
    0 <(select count(a.vote) from votes a where a.user=v.user and a.vote='down' group by user) d 
    group by user; 
[ATLEAST一個X,但沒有伊蘇查詢】(中
相關問題