View Single Post
  #6  
Old 02-21-2009, 04:49 AM
TigerC10's Avatar
TigerC10 TigerC10 is offline
 
Join Date: Apr 2006
Location: Austin, TX
Posts: 616
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by lazyseller View Post
I was able to reduce this down to just one query using

Code:
$sumgiveaways3 = $vbulletin->db->query_first("SELECT count(field6)AS CountTotal, sum(field6) as SumTotal FROM thread 
WHERE field6 IS NOT NULL AND thread.forumid = '25'");

$giveaways3 = $sumgiveaways3['CountTotal'];
$giveaways4 = $sumgiveaways3['SumTotal'];

Now i want to query field7 and display the content. Im a bit unsure where to start with that.

There would be multiple rows of content for field7 ex. name1, name2, name3
Cool, you got the idea of manipulating the SQL queries. One suggestion I would make, though. NULL is not the same thing as 0. If you have a 0 in the field, it WILL not be null - so be very carful with that.

Next, query_first is only going to return one row... So if you don't need to display lots of different field7 data, you should be okay to use it (but you're really going to have to be sure that what you're querying is correct - check out the MySQL syntax for ORDER BY to make sure of that).

Just tack it on like you did the others...

Code:
$sumgiveaways3 = $vbulletin->db->query_first("SELECT field7, count(field6)AS CountTotal, sum(field6) as SumTotal FROM thread 
WHERE field6 IS NOT NULL AND thread.forumid = '25'");

$giveaways3 = $sumgiveaways3['CountTotal'];
$giveaways4 = $sumgiveaways3['SumTotal'];

$giveaways5 = $sumgiveaways3['field7']
Though... You should probably change some of the names of those variables...

For getting multiple rows of content for field7 you'll want to use $vbulletin->db->query(); or $vbulletin->db->query_read(); (query_read is more "secure" since it doesn't accept update or delete/drop statements) instead of query_first... Though you might want to look into the LIMIT syntax for MySQL if you only want a few...

Code:
$sumgiveaways3 = $vbulletin->db->query("SELECT field7, count(field6)AS CountTotal, sum(field6) as SumTotal FROM thread 
WHERE field6 IS NOT NULL AND thread.forumid = '25' ORDER BY field7 DESC LIMIT 5");

$giveaways3 = $sumgiveaways3['CountTotal'];
$giveaways4 = $sumgiveaways3['SumTotal'];

$giveawayfield7 = array();
while( $row = $vbulletin->db->mysql_fetch_array($sumgiveaways3) )
{
     array_push($giveawayfield7, $row['field7']);
}
^That will only pull 5 rows, and it sorts the rows and selections of the rows by field7, the DESC keyword sorts them "backwards" eg. if it's a field of numbers the highest number is first - but if it's a field of strings then it will go backwards z->a... Alternatively you can sort with the ASC keyword for ascending to go 1->9 or a->z.

Finally, the while statement takes each row, and assigns all of the values in that row to a variable called $row, which you can treat as a regular array (print it, store it in another array - it doesn't matter. The query_first automagically does that for you, if you use the regular query you'll have to do that yourself.



The one thing I think you're doing wrong is trying to stuff it all into a single query. Queries are not always bad, especially if they're just reading the DB. See, by doing the counts and trying to get multiple rows of data for field7, you're wasting memory. Big time. When you use a count like on a multiple row select statement, every single row is going to have the count information... So here's what you could theoretically do:

Code:
$sumgiveaways3 = $vbulletin->db->query("SELECT field7, count(field6)AS CountTotal, sum(field6) as SumTotal FROM thread 
WHERE field6 IS NOT NULL AND thread.forumid = '25' ORDER BY field7 DESC LIMIT 5");

$giveaways3 = $sumgiveaways3['CountTotal'];
$giveaways4 = $sumgiveaways3['SumTotal'];

$giveawayfield7 = array();
while( $row = $vbulletin->db->mysql_fetch_array($sumgiveaways3) )
{
     array_push($giveawayfield7, $row['field7']);
     echo "Watch me waste memory!<br />Count Total: ".$row['CountTotal']."<br />Sum Total: ".$row['SumTotal'];
}

$name1 = $giveawayfield7[0];
$name2 = $giveawayfield7[1];
//etc, you get the idea.  The array $giveawayfield7 is 0 based.
Even if you didn't print the data, it's still in the array. This is a far worse toll on your server than doing two different database queries.

But hey, it's your server. Do what you want. Personally? I'd use the counts in a single query_first like you did and then do the field7 work separately.
Reply With Quote
 
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.01386 seconds
  • Memory Usage 1,792KB
  • Queries Executed 11 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD_SHOWPOST
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (4)bbcode_code
  • (1)bbcode_quote
  • (1)footer
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (6)option
  • (1)post_thanks_box
  • (1)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (1)post_thanks_postbit_info
  • (1)postbit
  • (1)postbit_onlinestatus
  • (1)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open 

Phrase Groups Available:
  • global
  • postbit
  • reputationlevel
  • showthread
Included Files:
  • ./showpost.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_postinfo_query
  • fetch_postinfo
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showpost_start
  • bbcode_fetch_tags
  • bbcode_create
  • postbit_factory
  • showpost_post
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • fetch_musername
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • showpost_complete