Skip to content

Instantly share code, notes, and snippets.

@Ocramius
Created April 14, 2011 13:23
Show Gist options
  • Select an option

  • Save Ocramius/919465 to your computer and use it in GitHub Desktop.

Select an option

Save Ocramius/919465 to your computer and use it in GitHub Desktop.
MySQL RAND() function in Doctrine2 DQL
<?php
$config = new \Doctrine\ORM\Configuration();
/** OTHER STUFF */
$config->addCustomNumericFunction('RAND', 'My\Custom\Doctrine2\Function\Rand');
/** CONTINUES */
<?php
namespace My\Custom\Doctrine2\Function;
/**
* RandFunction ::= "RAND" "(" ")"
*/
class Rand extends FunctionNode
{
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
return 'RAND()';
}
}

ghost commented Apr 16, 2014

Copy link
Copy Markdown

I have the same problem
Message: [Syntax Error] line 0, col 130: Error: Expected end of string, got '('

Has someone fixed this yet?

@nocomment17

Copy link
Copy Markdown

I have the same problem
Message: [Syntax Error] line 0, col 226: Error: Expected end of string, got '('

Has someone fixed this yet?

http://www.doctrine-project.org/blog/doctrine2-custom-dql-udfs => 404

@gusdecool

Copy link
Copy Markdown

This code messed up when using with JOIN query.

@dvapelnik

Copy link
Copy Markdown

Sorting by rand is a BAD idea. Don't do it!

@Ocramius why?

@sergiors

sergiors commented Jan 7, 2016

Copy link
Copy Markdown

@BenMorel

Copy link
Copy Markdown

@jeroensen @dvapelnik IIRC, sorting by RAND() forces a scan of all matching records, as RAND() is just a numerical function that returns a random number. If there is a small number of matching records, it should be alright. But if you have millions of matching records and attempt something like ORDER BY RAND() LIMIT 10, you might be in trouble, as the database will have to scan all these rows, remember all of them along with the number returned by RAND() for each of them, then extract the few ones with the lowest number (someone correct me if I'm wrong on the details). This is very resource intensive.

There are more efficient ways to select randomly. See for example:
http://jan.kneschke.de/projects/mysql/order-by-rand/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment