2012-03-09 15 views
5

Così, ho pensato che fosse abbastanza bravo a MySQL fino a quando mi sono imbattuto in questa idea:agli utenti di selezionare che hanno downvoted ma mai upvoted

ho una registrazione tabella "utili" (giustamente chiamato votes) con questi campi:

  • id: ID univoco del voto.
  • user: User ID univoco della persona che ha votato
  • item: ID di elemento che stanno votando
  • vote: Il voto che il cast set ('up', 'down')

Ora, sto cercando di trovare un modo SQL per trovare utenti i cui voti sono solo negativi. Conosco un modo per scriverlo in modo procedurale in php dopo aver interrogato la maggior parte dei dati fuori dalla tabella ma sembra davvero, davvero inefficiente farlo in quel modo quando solo alcune query potrebbero scoprirlo.

Idealmente voglio che il mio risultato sia solo un elenco di utenti che hanno 0 upvotes (come nel tavolo significa che hanno votato, quindi hanno solo downvote) e forse il numero di downvote che hanno lanciato.

Qualche idea su come dovrei affrontare questo?

+2

possibile duplicato di [almeno uno X, ma non Ys Query] (http://stackoverflow.com/questions/9626965/atleast-one-x-but-no- ys-query) –

+0

Oh wow, è molto simile, bello! – Tim

+0

Ho lasciato un commento sull'altra domanda (che penso abbia una buona risposta ed era un po 'prima) che ha bisogno di un titolo migliore, più SEO-friendly. Non so cosa sarebbe, di per sé, ma non penso * [Almeno una X ma nessuna query Ys] (http://stackoverflow.com/questions/9626965/at-least-one-x -but-no-ys-query) * funziona abbastanza bene per descrivere cosa significa. –

risposta

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 

non posso fare a meno di sentire c'è un GROUP BY user, vote modo pulito per fare questo anche se.

+0

L'output è esattamente quello che stavo cercando. – Tim

+0

Questo è piuttosto carino, e aggira il "problema" di non essere in grado di trovare "DOVE" un "ALIAS" per una sottoquery. –

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

Conta il numero di downvotes che ogni utente ha assegnato; ma se un utente ha sia downvoted che upvoted, continuerà a includerli (e il loro totale downvote). –

+0

@ mathematical.coffee: hai ragione. Fisso. – Dinah

+0

Questo è vicino, ma il conteggio (utente) sta dando il valore sbagliato (in questo caso 20 anziché 2.) – Tim

3

non ho controllato la sintassi o altro, ma questo viene in mente ...

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

Questo aspetto molto promettente, ma un modo per identificare esattamente quanti downvote ogni utente ha lanciato? – Tim

+0

Certo, dovresti essere in grado di aggiungere SUM (IF (vote = 'down', 1, 0)) AS DownVotes alla specifica della colonna. – Martin

0

Qualcosa di sbagliato nel farlo nella chiamata al database? Qualcosa di simile:

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

Un utente può avere più voti (ovvero più voci nella tabella).Questa query restituisce un record per ogni votazione, non per ogni utente, e restituirà anche gli utenti che hanno votato _no tutti giù, anche se hanno votato altre cose. – 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; 
Problemi correlati