Resumo : neste tutorial, você aprenderá várias técnicas para selecionar registros aleatórios de uma tabela de banco de dados no MySQL.
Às vezes, você precisa selecionar registros aleatórios de uma tabela, por exemplo:
- Selecione algumas postagens aleatórias em um blog e exiba-as na barra lateral.
- Selecione uma cotação aleatória para exibir o widget “cotação do dia”.
- Selecione fotos aleatórias em uma galeria e use-as como fotos em destaque.
Selecionando registros aleatórios usando ORDER BY RAND()
O MySQL não possui nenhuma instrução interna para selecionar linhas aleatórias de uma tabela. Para fazer isso, você usa a RAND()
função.
A consulta a seguir seleciona uma linha aleatória de uma tabela de banco de dados:
SELECT *
FROM table_name
ORDER BY RAND()
LIMIT 1;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Vamos examinar a consulta com mais detalhes.
- A função
RAND()
gera um valor aleatório para cada linha da tabela. - A
ORDER BY
cláusula classifica todas as linhas da tabela pelo número aleatório gerado pelaRAND()
função. - A
LIMIT
cláusula escolhe a primeira linha no conjunto de resultados classificada aleatoriamente.
Se quiser selecionar N
registros aleatórios de uma tabela de banco de dados, você precisará alterar a LIMIT
cláusula da seguinte forma:
SELECT * FROM table_name
ORDER BY RAND()
LIMIT N;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Consulte a customers
tabela a seguir do banco de dados de exemplo :
O exemplo a seguir seleciona cinco clientes aleatórios da customers
tabela:
SELECT
customerNumber,
customerName
FROM
customers
ORDER BY RAND()
LIMIT 5;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Observe que você pode obter um conjunto de resultados diferente porque é aleatório.
Essa técnica funciona muito bem com uma mesa pequena. No entanto, será lento para a tabela grande porque o MySQL precisa classificar a tabela inteira para selecionar as aleatórias.
A velocidade da consulta também depende do número de linhas da tabela. Quanto mais linhas a tabela tiver, mais tempo levará para gerar o número aleatório para cada linha.
Selecionando registros aleatórios usando uma cláusula INNER JOIN
Esta técnica requer que a tabela tenha um campo de chave primária de incremento automático e que não haja lacuna na sequência .
A consulta a seguir gera um número aleatório com base na coluna de chave primária :
SELECT
ROUND(RAND() * ( SELECT MAX(id) FROM table_name)) AS id;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Podemos unir a tabela com o conjunto de resultados retornado pela consulta acima da seguinte forma:
SELECT t.*
FROM table_name AS t
INNER JOIN
(SELECT ROUND(
RAND() *
(SELECT MAX(id) FROM table_NAME )) AS id
) AS x
WHERE
t.id >= x.id
LIMIT 1;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Usando esta técnica, você deve executar a consulta várias vezes para obter mais de uma linha aleatória porque se você aumentar o limite, a consulta fornecerá apenas linhas sequenciais que começam na linha selecionada aleatoriamente.
A consulta a seguir retorna um cliente aleatório da customers
tabela.
SELECT
t.customerNumber, t.customerName
FROM
customers AS t
JOIN
(SELECT
ROUND(RAND() * (SELECT
MAX(customerNumber)
FROM
customers)) AS customerNumber
) AS x
WHERE
t.customerNumber >= x.customerNumber
LIMIT 1;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Selecionando registros aleatórios usando variáveis
Caso a tabela possua id
coluna com os valores que estão dentro de um intervalo 1..N
e não haja lacuna no intervalo, pode-se utilizar a seguinte técnica:
- Primeiro, selecione números aleatórios no intervalo 1..N.
- Segundo, escolha os registros com base nos números aleatórios.
A declaração a seguir ajuda você a fazer isso:
SELECT
table. *
FROM
(SELECT
ROUND(RAND() * (SELECT
MAX(id)
FROM
table)) random_num,
@num:=@num + 1
FROM
(SELECT @num:=0) AS a, table
LIMIT N) AS b,
table AS t
WHERE
b.random_num = t.id;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Observe que as variáveis definidas pelo usuário são específicas da conexão. Isso significa que esta técnica não pode ser usada com o pool de conexões. Além disso, a chave primária deve ser do tipo inteiro e seus valores devem estar na sequência sem lacunas.
Neste tutorial, mostramos várias técnicas para selecionar registros aleatórios de uma tabela.