2012-03-09 8 views
5

तो, मैंने सोचा कि मैं MySQL में बहुत अच्छी हो रही थी जब तक मैं इस विचार में भाग:का चयन करने वाले उपयोगकर्ताओं downvoted है, लेकिन upvoted कभी नहीं

मैं एक मेज लॉगिंग "वोट" है इन क्षेत्रों के साथ (जिसे उपयुक्त votes नाम):

  • id: वोट की अद्वितीय आईडी।
  • user: जो व्यक्ति
  • मतदान का अनोखा यूज़र आईडी
  • item: आइटम के आईडी वे
  • vote पर वोट कर रहे: वोट वे ('नीचे', 'अप') सेट कलाकारों

अब, मैं उन उपयोगकर्ताओं को खोजने के लिए एक एसक्यूएल तरीके से आने की कोशिश कर रहा हूं जिनके वोट केवल डाउनवॉट हैं। मुझे तालिका के अधिकांश डेटा पूछताछ के बाद इसे php में प्रक्रियात्मक रूप से लिखने का एक तरीका पता है, लेकिन वास्तव में ऐसा लगता है कि वास्तव में ऐसा करने में अक्षम नहीं है जब केवल कुछ प्रश्न ही इसे प्राप्त कर सकें।

आदर्श रूप से मैं चाहता हूं कि मेरा परिणाम केवल उन उपयोगकर्ताओं की सूची हो, जिनके पास 0 अपवॉट्स हैं (जैसा कि तालिका में होना है, वे केवल मतदान कर चुके हैं, इसलिए वे केवल डाउनवोट करते हैं) और हो सकता है कि वे डाउनवॉट्स डाले गए हों।

इस पर कोई विचार है कि मुझे इस पर कैसे पहुंचा जाना चाहिए?

+2

संभव डुप्लिकेट http://stackoverflow.com/questions/9626965/atleast-one-x-but-no- वाईएस-क्वेरी) –

+0

ओह वाह, यह बहुत समान है, अच्छा! – Tim

+0

मैंने दूसरे प्रश्न पर एक टिप्पणी छोड़ दी (जो मुझे लगता है कि एक अच्छा जवाब है और थोड़ा सा था) कि इसे बेहतर, अधिक एसईओ-अनुकूल शीर्षक की आवश्यकता है। मुझे नहीं पता कि यह क्या होगा, लेकिन मुझे नहीं लगता * [कम से कम एक एक्स लेकिन कोई वाई प्रश्न नहीं] (http://stackoverflow.com/questions/9626965/at-least-one-x -बूट-नो-वाईएस-क्वेरी) * इसका अर्थ क्या है इसका वर्णन करने के लिए पर्याप्त काम करता है। –

उत्तर

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

+0

यह बहुत निफ्टी है, और "समस्या" के आसपास हो जाता है, जो 'ALIAS'' से मेल खाने में सक्षम नहीं है, सबक्वायरी के लिए उपयोग किया जाता है। –

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

यह प्रत्येक उपयोगकर्ता द्वारा दिए गए डाउनवॉट्स की संख्या की गणना करता है; लेकिन यदि किसी उपयोगकर्ता ने दोनों को डाउनवॉटेड और अपवित्र किया है, तो इसमें अभी भी उन्हें शामिल किया जाएगा (और उनका डाउनवोट कुल)। –

+0

@ गणितीय.coffee: आप सही हैं। फिक्स्ड। – Dinah

+0

यह करीब है, लेकिन गिनती (उपयोगकर्ता) गलत मान दे रही है (इस मामले में, 2 के बजाय 20) – Tim

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

+0

निश्चित रूप से, आप कॉलम विनिर्देश के लिए डाउनवॉट्स के रूप में एसयूएम (आईएफ (वोट = 'डाउन', 1, 0) जोड़ने में सक्षम होना चाहिए। – Martin

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

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; 
[कम से कम एक एक्स, लेकिन कोई वाईएस क्वेरी] (की
संबंधित मुद्दे