Randomiser des résultats de requête MySQL
Publié le 27/01/2020 • Actualisé le 27/01/2020
Dans ce bout de code, nous allons voir comment "randomiser" les résultats d'une requête MySQL. Sur ce site, je m'en sers pour la fonctionnalité snippet aléatoire . Dans ce cas, je n'ai besoin que d'une ligne, j'ajoute donc LIMIT 1
à la clause SQL. Sur la page d'exécution du snippet, rafraichissez plusieurs fois afin de vérifier que l'ID retourné change bien (ou pas ! C'est aléatoire !). Faite attention de ne pas utiliser ceci sur de trop larges jeux de données (de plus de 10000 lignes) ou vous risquez d'avoir des problèmes de performance.
<?php
declare(strict_types=1);
namespace App\Controller\Snippet;
use App\DBAL\Types\ArticleType;
use Doctrine\DBAL\Connection;
/**
* J'utilise un trait PHP afin d'isoler chaque snippet dans un fichier.
* Ce code doit être apellé d'un contrôleur Symfony étendant AbstractController (depuis Symfony 4.2)
* ou Symfony\Bundle\FrameworkBundle\Controller\Controller (Symfony <= 4.1).
* Les services sont injectés dans le constructeur du contrôleur principal.
*
* @property Connection $connection
*/
trait Snippet74Trait
{
public function snippet74(): void
{
$sql = \sprintf("SELECT * FROM article WHERE type = '%s' ORDER BY RAND() LIMIT 1", ArticleType::TYPE_SNIPPET);
$article = $this->connection->fetchAllAssociative($sql)[0] ?? [];
echo 'Random snippet id: '.$article['id'];
// That's it! 😁
}
}
Exécuter le snippet ≪ this.showUnitTest ? this.trans.hide_unit_test : this.trans.show_unit_test ≫ Plus sur Stackoverflow Lire la doc Plus sur le web
<?php
declare(strict_types=1);
namespace App\Tests\Integration\Controller\Snippets;
use App\DBAL\Types\ArticleType;
use App\Tests\WebTestCase;
use Doctrine\DBAL\Connection;
/**
* @see Snippet74Trait
*/
final class Snippet74Test extends WebTestCase
{
private Connection $connection;
protected function setUp(): void
{
$this->connection = $this->getDoctrineDefaultConnection();
}
/**
* @see Snippet74Trait::snippet74
*/
public function testSnippet74(): void
{
$sql = \sprintf("SELECT * FROM article WHERE type = '%s' ORDER BY RAND() LIMIT 1", ArticleType::TYPE_SNIPPET);
$article = $this->connection->fetchAllAssociative($sql)[0] ?? [];
self::assertIsArray($article);
self::assertSame(ArticleType::TYPE_SNIPPET, $article['type']);
}
}