I've decided to put something in here as it took me an age to find out how I could do it.
This is when using a MySQL query within a PHP script. The process is used often to do a statistics table or top ten chart of your data (eg. movies, music, etc).
My aim is to do the following:
- retrieve data from a table,
- count the number of times each data exists,
- sort it in reverse order so that the most frequent is at the top of the list
- print out each row with the number of times that particular data appeared in a row
My old method was to:
- Select distinct column1.table1 FROM table1
- PHP script would loop through all rows of the above mysql query
- Count for each row how many times the column1.table1 value appears in table1
- Format this count result by prefixing with leading zeros (for sorting purposes - eg. so 10 is not before 2)
- Store both the formatted count and the value of column1.table in the next array entry
- Reverse this array
- Display the first 10 rows of this array (if we are doing a top ten)
My new method is:
- SELECT column1, COUNT(*) AS CountOrder FROM table1 GROUP BY column1 ORDER BY CountOrder DESC LIMIT 0,10
- PHP script to loop through the results of the above query
- Display the value of column1 and CountOrder
The old code would have been:
copyraw
	
echo '# | Search Term | Count' . "\n";
# create an array of search terms with their frequency count
$search_table_results=mysql_query("SELECT DISTINCT column1 FROM table1");
while($row=mysql_fetch_assoc($search_table_results)) {
	$this_value=trim($row['column1']);
	$this_value_num=mysql_num_rows(mysql_query("SELECT column1 FROM table1 WHERE column1='$this_value'")); 
	if (($this_value!="") && ($this_value_num>5)) {
		$this_value_num=sprintf("%010d",$this_value_num);
		$fresh_array[]=$this_value_num.'|'.$this_value;
	}
}
rsort($fresh_array);
for ($i=0;$i<10;$i++) {
	$temp_array=array();
	$temp_array=explode("|", $fresh_array[$i]);
	$this_value=$temp_array[1];
	$this_value_num=$temp_array[0]*1;
	echo ($i+1).' | '.$this_value.' | '.$this_value_num . "\n";
}
	- echo '# | Search Term | Count' . "\n";
- # create an array of search terms with their frequency count
- $search_table_results=mysql_query("SELECT DISTINCT column1 FROM table1");
- while($row=mysql_fetch_assoc($search_table_results)) {
- $this_value=trim($row['column1']);
- $this_value_num=mysql_num_rows(mysql_query("SELECT column1 FROM table1 WHERE column1='$this_value'"));
- if (($this_value!="") && ($this_value_num>5)) {
- $this_value_num=sprintf("%010d",$this_value_num);
- $fresh_array[]=$this_value_num.'|'.$this_value;
- }
- }
- rsort($fresh_array);
- for ($i=0;$i<10;$i++) {
- $temp_array=array();
- $temp_array=explode("|", $fresh_array[$i]);
- $this_value=$temp_array[1];
- $this_value_num=$temp_array[0]*1;
- echo ($i+1).' | '.$this_value.' | '.$this_value_num . "\n";
- }
The new code is just:
copyraw
	
echo '# | Search Term | Count' . "\n";
$num_records=0; $num_results=mysql_query("SELECT column1, COUNT(*) AS CountOrder FROM table1 GROUP BY column1 ORDER BY CountOrder DESC LIMIT 0,10");
while($row=mysql_fetch_assoc($num_results)) {
	$num_records++; 
	$this_value=trim($row['column1']);
	$this_value_num=$row['CountOrder']*1;
	echo $num_records.' | '.$this_value.' | '.$this_value_num . "\n";
}
	- echo '# | Search Term | Count' . "\n";
- $num_records=0; $num_results=mysql_query("SELECT column1, COUNT(*) as CountOrder FROM table1 GROUP BY column1 ORDER BY CountOrder DESC LIMIT 0,10");
- while($row=mysql_fetch_assoc($num_results)) {
- $num_records++;
- $this_value=trim($row['column1']);
- $this_value_num=$row['CountOrder']*1;
- echo $num_records.' | '.$this_value.' | '.$this_value_num . "\n";
- }
Obviously method 2 is unsurprisingly quicker, both for you and the server...
Category: Personal Home Page :: Article: 242
	

 
						  
                 
						  
                 
						  
                 
						  
                 
						  
                 
 
 

 
 
Add comment