Showing posts with label Mysql. Show all posts
Showing posts with label Mysql. Show all posts

Wednesday, 13 January 2010

MYSQL and PHP, how do I show a random group of records where count >1


I've just added to my favourite #fridayflash list , a featured Author selection. Where I have been adding stories each week, there are naturally several authors appearing more than once. What I wanted to do, was feature one of these author on the page, by random selection, and list their stories.

I apologies if the language might seem a bit funny in this post, but from trying to do it, it was not what I quite expected and took a bit of googling. I am typing this post this way, in the hope someone with the same problem finds it easy on google.

Firstly my data is stored in the following table structure.


CREATE TABLE IF NOT EXISTS `fridayflash` (
  `sID` int(11) NOT NULL auto_increment,
  `week` int(11) NOT NULL,
  `sortA` varchar(1) NOT NULL,
  `title` varchar(200) NOT NULL,
  `author` varchar(200) NOT NULL,
  `twitter` varchar(200) NOT NULL,
  `link` varchar(200) NOT NULL,
  `review` varchar(200) NOT NULL,
  `notes` varchar(200) NOT NULL,
  PRIMARY KEY  (`sID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=45 ;

The first thing I needed to was find out all of those authors who had more than one entry in the database. My SQL looked liked the following *

SELECT author
FROM fridayflash
GROUP BY author
HAVING COUNT( sID ) >1



The next thing, was to limit by select one of these records by random. To achieve this, I added the following two lines to the bottom of the query. 


SELECT author
FROM fridayflash
GROUP BY author
HAVING COUNT( sID ) >1
ORDER BY RAND( )
LIMIT 1



I now then wanted to select all the stories by my random selection and this is where I began to run into problems.  Firstly approaching this as if i was using Oracle of SQL Server and using nested queries, HAVING or WHERE. I ran into the error

'This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'


I found my solution here on this article on sub queries  and got the required result, by using the following SQL

SELECT *
FROM fridayflash
INNER JOIN (

SELECT author AS b
FROM fridayflash
GROUP BY author
HAVING COUNT( sID ) >1
ORDER BY RAND( )
LIMIT 1
) AS c ON fridayflash.author = c.b



I then created the following PHP Function **
function FeaturedAuthor()
{
$counter = 1;

$sql = "SELECT * FROM fridayflash
INNER JOIN (
SELECT author AS b
FROM fridayflash
GROUP BY author
HAVING COUNT( sID ) >1
ORDER BY RAND( )
LIMIT 1) AS c
ON fridayflash.author = c.b";

$result = mysql_query($sql)
or die(mysql_error());

if (mysql_num_rows($result) == 0)
{
echo "<em>No created.</em>";
} else {


while ($row = mysql_fetch_array($result))
{
If ($counter == 1)
{
echo "<h1>" ."<a href=http://twitter.com/" . $row['twitter'] .">". $row['author'] . " <a>" ."</h1>";
}

echo "<p><a href=" . $row['link'] . ">" . $row['title'] ."</a> " .
$row['review'] . "</i></p>";

$counter = $counter ++;
}
}


}




And you can see the result on the #fridayflash list page of my site, just under the Most Recent stories added. If you hit F5 you will see the featured author change.

*Yes, I know using author name is not an ideal key :-p, let me tell you sometime of a horror story involving a developer being allowed free roam on the company servers without any DBA's to distract you.
** I'm very slowly learning php, I am not happy with the use of the counter in the above to make sure the author name is only outputted once.  Suggestions ? 








Thursday, 12 November 2009

Creating a Multiselect box from mysql source

*** Disclaimer, If you are the type of person who thinks the internet owes you everything then this post is probably not for you. Read a book for a change ***

Just adding these disclaimers, as this blog is more my thought process as I am teaching myself php. I make no claims for anything being the best or right way to do things.

One of the main reason for these posts, is so I cam easily copy pasta bits no matter where I am.

Anyhow, going back to my recipe section on my site that I'm building, I want on the form a multiple select box for the ingredients. I have the following table on my database


CREATE TABLE IF NOT EXISTS `ingredients` (
`iId` int(11) NOT NULL auto_increment,
`type` varchar(255) NOT NULL,
`name` varchar(255) NOT NULL,
`notes` varchar(255) NOT NULL,
PRIMARY KEY (`iId`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=31 ;

Just a note about why I have type in my ingredients. This is one of my bugbears with a lot of recipe listingsis they never group the ingredients by type. I am including type so that you can copy down the recipe and go to the supermarket and be less likely to miss anything off.

The Function for the multibox select is as follows

Function listIngredients()
{
$html ='<select name="Ingr[]" multiple="multiple">';
$sql=" SELECT `iId` , `name`
FROM `ingredients`
ORDER BY TYPE , name
LIMIT 0 , 30 ";

$result = mysql_query($sql)
or die(mysql_error());

if (mysql_num_rows($result) == 0)
{
echo "<em>No created.</em>";
}
else
{
while ($row = mysql_fetch_array($result))
{
$html .= '<option value='. $row['rId'].'>'.$row['name'].'</option>';
}
}
$html .= '</select>';
echo $html;
}

Monday, 9 November 2009

Adding items to a dropdown from a MYSQL Database

*** Disclaimer I do not know if this is the best method or is even correct, if you are the type of person who reads things on the internet, tries them out and then gets annoyed when things don't work out. Then maybe this post is not for you, go outside instead and enjoy some fresh air ***

My next php project is, I'm building a small recipe section for my chance1234.com site. I've started on working on a form to allow myself to add recipes to the database.

One of the options I want when adding recipes is to be able to clarify recipes by type. ie pasta dishes, soups etc

What I did was set up a table on mysql database called rtype


CREATE TABLE IF NOT EXISTS `rType` (
`rId` int(11) NOT NULL auto_increment,
`type` varchar(255) NOT NULL,
`Notes` varchar(255) NOT NULL,
PRIMARY KEY (`rId`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

Then on my php file, I created the following function

Function listRecipesTypes()
{
$html ='<select name="'.$name.'">';
$sql="SELECT rID,type FROM rType";

$result = mysql_query($sql)
or die(mysql_error());

if (mysql_num_rows($result) == 0)
{
echo "<em>No created.</em>";
}
else
{
while ($row = mysql_fetch_array($result))
{
$html .= '<option value='. $row['rId'].'>'.$row['type'].'</option>';
}
}
$html .= '</select>';
echo $html;
}

?>


I adapted the code from a Make a Website post. Ideally what I want to do is adapt the function so I can chuck any array at it.

LinkWithin

Related Posts with Thumbnails