MySQL seleciona registros aleatórios

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 pela RAND()função.
  • A LIMITcláusula escolhe a primeira linha no conjunto de resultados classificada aleatoriamente.

Se quiser selecionar Nregistros aleatórios de uma tabela de banco de dados, você precisará alterar a LIMITclá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 customerstabela a seguir do banco de dados de exemplo :

O exemplo a seguir seleciona cinco clientes aleatórios da customerstabela:

SELECT 
    customerNumber, 
    customerName
FROM
    customers
ORDER BY RAND()
LIMIT 5;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Experimente

mysql seleciona clientes aleatórios

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 customerstabela.

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 )

Experimente

mysql seleciona clientes aleatórios usando join

Selecionando registros aleatórios usando variáveis

Caso a tabela possua idcoluna com os valores que estão dentro de um intervalo 1..Ne 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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *