Solved

Help with a Mysql Statement. Retrieving 5 random values excluding some based on the key

Posted on 2006-06-29
16
431 Views
Last Modified: 2006-11-18
I have a MySQL Table:

questions (
questionid int unsigned not null auto_increment primary key,
question text not null
);

   
I need to retrieve a random question from the database, excluding five contained in the array $quests.

i.e.
if i had
      $quests[0] = 5
      $quests[1] = 7
      $quests[2] = 13
      $quests[3] = 16
      $quests[4] = 21

then:
I need a random questions(the text) excluding any with number keys 5,7,13,16,21.
This may seem simple but I keep getting erros in my SQL statement so please help. =)

0
Comment
Question by:stormist
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 9
  • 4
  • 3
16 Comments
 
LVL 143

Accepted Solution

by:
Guy Hengel [angelIII / a3] earned 300 total points
ID: 17011141
$strsql = "select * from questions where questionid not in ( " . join (",", $quests) . ")  ORDER BY RAND() LIMIT 5 ";
0
 
LVL 8

Expert Comment

by:Autogard
ID: 17011217
Set up the series of items to exclude:
$excludeQueryPart = implode(" OR questionid != ", $quests);

Then your query would be:
SELECT question FROM questions WHERE questionid != $excludeQueryPart ORDER BY RAND() LIMIT 1

(http://www.desilva.biz/mysql/random.html)
0
 
LVL 8

Expert Comment

by:Autogard
ID: 17011229
whups -- angelll's should also work, but to just get 1 question you will want "LIMIT 1"
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 143

Expert Comment

by:Guy Hengel [angelIII / a3]
ID: 17011252
Autogard: >Retrieving 5 random values ...
0
 
LVL 8

Expert Comment

by:Autogard
ID: 17011266
I was basing my comment on the text of the question, not the title:

Text: "I need to retrieve a random question from the database, excluding five" and "I need a random question"
Title: "Retrieving 5 random values"

Hence, the confusion.  :)
0
 
LVL 10

Author Comment

by:stormist
ID: 17011347
I can't seem to get it to work.. Can we go back to basics and go over the proper way to extract the results from this statement? I just want to make sure I'm not making a silly error..

0
 
LVL 10

Author Comment

by:stormist
ID: 17011375
Substituting the values the variable puts in the following statement doesnt seem to be working:

$sql = "SELECT * FROM questionstoask WHERE questionid NOT IN 20,1,19,23,16 ORDER BY RAND() LIMIT 1"

Here is my actual table layout to avoid confusion:

 table questionstoask (
    questionid int unsigned not null auto_increment primary key,
    question text not null,
    category char(50) not null,
    picture char(30)
);
0
 
LVL 8

Assisted Solution

by:Autogard
Autogard earned 200 total points
ID: 17011389
$result = mysql_query("SELECT question FROM questions WHERE questionid != $excludeQueryPart ORDER BY RAND() LIMIT 1");
if(!$result)
{
    print "ERROR: " . mysql_error() . "<br>";
}
else
{
    $questionRow = mysql_fetch_object();
    print "Question: " . $questionRow->question . "<br>";
}
0
 
LVL 8

Expert Comment

by:Autogard
ID: 17011397
Two fixes related to my suggestion:

1. $excludeQueryPart = implode(" OR questionid != ", $quests); -- replace "OR" with "AND" (in my first suggestion)
2. Replace "SELECT question FROM questions" with "SELECT question FROM questionstoask" (in my last suggestion)
0
 
LVL 8

Expert Comment

by:Autogard
ID: 17011407
With regards to angelll's suggestion it looks like you are missing the opening and closing parentheses in your implementation.
0
 
LVL 8

Expert Comment

by:Autogard
ID: 17011434
3. Replace "mysql_fetch_object();" with "mysql_fetch_object($result);"

Note: this is if you really just want 1 question.  If you want 5 you will need to loop through the results (www.php.net/mysql_fetch_object);
0
 
LVL 143

Expert Comment

by:Guy Hengel [angelIII / a3]
ID: 17011454
>With regards to angelll's suggestion it looks like you are missing the opening and closing parentheses in your implementation.
Here is the code again:
$strsql = "select * from questions where questionid not in ( " . join(",", $quests) . ")  ORDER BY RAND() LIMIT 5 ";

where are there parentheses missing? I think all is in there? Or are you referring to the output posted by the questionner? there indeed are the (  ) missing, although they should be there.
0
 
LVL 8

Expert Comment

by:Autogard
ID: 17011468
Yes, I was referring to stormist's "$sql = "SELECT * FROM questionstoask WHERE questionid NOT IN 20,1,19,23,16 ORDER BY RAND() LIMIT 1"" --> no parentheses.
0
 
LVL 10

Author Comment

by:stormist
ID: 17011826
Thanks guys its working.. While you two are here, might I ask a problem related to this? I am passing the numbers to the processing script by AJAX and a GET statement. The problem is it doesnt seem to work when I use any letters or nonnumerical characters. So I have five questions on the screen. The script returns a question that doesn't include any of the five already listed. (which now works thanks to your help) The problem is I'm using "88" as a seperator. This is all fine unless one of my question Ids happens to be one that contains and eight.
<?php
$allofthem = $_GET['questions'];
$quests = explode('88', $allofthem);
$conn = dbinfo();        
$sql = "select * from questionstoask where questionid not in ( " . join (",", $quests) . ")  ORDER BY RAND() LIMIT 1 ";
$result = mysql_query($sql) or die(mysql_error());
$newquestion = mysql_result($result,0,1);
echo $newquestion;
?>
any ideas on how to solve this? Thanks a bunch for your help
0
 
LVL 143

Expert Comment

by:Guy Hengel [angelIII / a3]
ID: 17012952
>This is all fine unless one of my question Ids happens to be one that contains and eight.

how did you come to the idea to use 88 as separator?????

depending on what you have as values (assuming you only have numerical values), you might use _  or __ instead

0
 
LVL 8

Expert Comment

by:Autogard
ID: 17012955
Your IDs are always numerical values, right?  So can you use another delimiter besides "88"?

If there are always 5 questions you could also do something like this: ?q1=14&q2=17&q3=12&q4=8&q5=3
0

Featured Post

On Demand Webinar: Networking for the Cloud Era

Ready to improve network connectivity? Watch this webinar to learn how SD-WANs and a one-click instant connect tool can boost provisions, deployment, and management of your cloud connection.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Since pre-biblical times, humans have sought ways to keep secrets, and share the secrets selectively.  This article explores the ways PHP can be used to hide and encrypt information.
This article discusses how to implement server side field validation and display customized error messages to the client.
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…
The viewer will learn how to dynamically set the form action using jQuery.

623 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question