Fairly complex question about grouping and counting rows in different tables

Discussion in 'Databases' started by jpigford, Apr 8, 2006.

  1. #1
    Okay, so the end goal here is to list items and change their size based on the number of "votes" for/against the item.

    ie. item1 item2 item3 item4

    In the case above, item4 has the most votes for it and item1 has the least.

    From a previous post about something like this, I was able to get a block of code that pulls from one table and then counts the number of times a tag is in that table...so if the tag is in there 100 times it'd be larger than a tag only in there 4 times. My situation now is a bit different as I'm pulling from 2 tables and the site of the item is based on the votes.

    Here's the previous block of code:
    
    // Font size 
    $maxfontsize = 1.8; 
    $minfontsize = 0.6; 
    
    
    $query = mysql_query('SELECT itemName, COUNT(itemName) AS count FROM item GROUP BY itemName');
    $max = $low = 0; 
    while($row = mysql_fetch_array($query)) 
    { 
        $max = ($row['count'] > $max) ? $row['count'] : $max; 
        $low = ($row['count'] < $low) ? $row['count'] : $low; 
    
        $counts[$row['itemName']] = $row['count']; 
    	
    	$totalCount += $row['count'];
    } 
    
    // Calculate our range. 
    $staticrange = $maxfontsize - $minfontsize; 
    $dynamicrange = $max - $low; 
    
    // Figure out what 1 dynamicrange increment will affect the $staticrange 
    $inc = $staticrange / $dynamicrange; // static = 10, dynamic = 4, inc = 2.5. Each dynamic increment requires 2.5 increments on the scale. 
    
    // Output 
    foreach($counts AS $tagname=>$count) 
    { 
    	$percent = ($count / $totalCount) * 100;
    		$percent *= 10;
            if ($percent < 5)
            {
                $backgroundColor = 'level1';
            }
            elseif ($percent < 15)
            {
                $backgroundColor = 'level2';
            }
            elseif ($percent < 100)
            {
                $backgroundColor = 'level3';
            }
    		
        $size = $minfontsize + $count * $inc; 
        echo '<span style="font-size: '.$size.'em;" class="'.$backgroundColor.'"><a title="'.$tagname.'" href="/tag/'.$tagname.'/">'.$tagname.'</a></span> '; 
    }
    PHP:
    That code above successfully pulls all the items from the "items" table, but doesn't resize them because there aren't duplicate items.

    Now, I need to pull from a separate database which is setup like this:
    
    bansId | bansItemId | bansUserId | bansForAgainst
    ---------------------------------------------------------
    1          1                 3                 1
    2          2                 3                 1
    12        8                 4                 0
    13        8                 6                 1
    14        8                 9                 1
    
    Code (markup):
    This table is used to record people who are for/against an item. The more people for an item (a "1"), the larger the text needs to be.

    In the case above, rows 12-14 would have a total of "1" to go towards making the item larger as a "0" here means "against" the item. Sort of like saying 1+1-1...which would equal 1.

    Soooo...not sure what other info is needed here, but some help would be much appreciated.
     
    jpigford, Apr 8, 2006 IP
  2. Slapyo

    Slapyo Well-Known Member

    Messages:
    266
    Likes Received:
    7
    Best Answers:
    0
    Trophy Points:
    108
    #2
    You can do it in 1 query by doing a LEFT JOIN. Can you provide the table structure for the 2 tables. I'm assuming that bansItemId is the same ID that is in the item table?
     
    Slapyo, Apr 10, 2006 IP