2012-03-09 13 views
5

Tak, myślałem, że się całkiem dobry MySQL aż wpadłem na ten pomysł:wybrać użytkowników, którzy downvoted ale nigdy upvoted

Mam rejestrowania tabeli „głosy” (o wdzięcznej nazwie votes) z tych pól:

  • id: Unikalny identyfikator głosowania.
  • user: Unikalny identyfikator użytkownika osoby, która głosowała
  • item: Identyfikator elementu oni głosując na
  • vote: Głosowanie rzucili SET ('w górę', 'w dół')

Teraz próbuję wymyślić sposób SQL, aby znaleźć użytkowników, których tylko głosy są spadkowe. Znam sposób, aby napisać to proceduralnie w php po zapytaniu o większość danych z tabeli, ale wydaje się naprawdę, naprawdę nieskuteczne, aby to zrobić, gdy tylko kilka zapytań może to stwierdzić.

Idealnie chciałbym, aby mój wynik był po prostu listą użytkowników, którzy mają 0 przegranych (ponieważ będąc w tabeli oznacza, że ​​głosowali, więc tylko przegłosują) i może liczba odrzuconych głosów została odrzucona.

Jakieś pomysły na to, jak powinienem się do tego podejść?

+2

możliwe duplikat [conajmniej jeden X, ale nie Ys Query] (http://stackoverflow.com/questions/9626965/atleast-one-x-but-no- Zapytanie ys) –

+0

Oh wow, to jest bardzo podobne, miłe! – Tim

+0

Zostawiłem komentarz do drugiego pytania (które, jak sądzę, ma dobrą odpowiedź i było trochę wcześniej), że potrzebuje lepszego, bardziej przyjaznego SEO tytułu. Nie wiem, co by to było, per se, ale nie sądzę * [Przynajmniej jeden X ale bez zapytania Ys] (http://stackoverflow.com/questions/9626965/at-least-one-x -but-no-ys-query) * wystarczająco dobrze działa, aby opisać, co to znaczy. –

Odpowiedz

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 

nie mogę pomóc, ale czuję, że to czysty GROUP BY user, vote sposobem, aby to zrobić chociaż.

+0

Dane wyjściowe są dokładnie tym, czego szukałem. – Tim

+0

To jest całkiem sprytne i omija "problem" polegający na tym, że nie można dopasować "WHERE", a "ALIAS" jest używany do podzapytania. –

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

Zlicza to liczbę spadków, które podał każdy użytkownik; ale jeśli użytkownik ma zarówno obniżone, jak i przegłosowane, nadal będzie je uwzględniał (i ich całkowity przychód). –

+0

@ mathematical.coffee: masz rację. Naprawiony. – Dinah

+0

To jest blisko, ale count (użytkownik) podaje niewłaściwą wartość (w tym przypadku 20 zamiast 2.) – Tim

3

Nie sprawdził składnię lub coś, ale to przychodzi do głowy ...

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

To wygląda bardzo obiecujące, ale w jakikolwiek sposób, aby dokładnie określić, ile spadnie liczba głosów każdego użytkownika? – Tim

+0

Oczywiście, powinieneś być w stanie dodać SUMA (JEŻELI (głosowanie = "w dół", 1, 0)) AS Dezaktywuje specyfikację kolumny. – Martin

0

Coś nie tak z wykonaniem połączenia z bazą danych? Takim jak:

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

Użytkownik może mieć wiele głosów (co oznacza wiele wpisów w tabeli).Ta kwerenda zwraca jeden rekord dla każdego głosu, nie dla każdego użytkownika, a także zwróci użytkowników, którzy oddali _anything_ w dół, nawet jeśli głosowali na inne rzeczy. – octern

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; 
Powiązane problemy