Seleccionar um registo aleatório duma base-de-dados MySQL

Neste momento tenho um novo projecto pessoal em construção.
Planeado e imaginado, senão devidamente, pelo menos o fundamental tendo em consideração o escasso tempo livre que tenho, é tempo de arregaçar as mangas e começar a programá-lo.

Para este projecto é necessário buscar dados a uma base-de-dados MySQL. Quero que o resultado dessa busca seja diferente cada vez que é feito pedido à BD. Isto é, que seja aleatório.

Lembrei-me de uma passagem que li no meu livro PHP & MySQL – Larry Ulman acerca das funções SQL e decidi usar uma delas. A função RAND().

Sem o livro à mão uma simples pesquisa no Google por “select random row from mysql” levou-me ao site de Pete Freitag onde são ensinadas várias formas de pesquisar por um registo aleatório em vários tipos de base-de-dados.

O código que me interessava referia-se a uma base-de-dados MySQL.
(Na mesma página podem ainda encontrar opções para outros tipos de base-de-dados como PostgreSQL, Microsoft SQL Server, Oracle.)

SELECT column FROM table ORDER BY RAND() LIMIT 1

O código acima é fácil de explicar. É feito um SELECT (uma selecção) duma column (campo ou coluna) pertencente a uma table (tabela). A seguir faz-se uma ordenação (ORDER BY) usando a função RAND() (rand vem de random, aleatório em português) e, por fim, limitam-se os resultados a um registo (LIMIT 1).

Se quiserem podem experimentar usando o phpMyAdmin (disponível na maior parte dos serviços de alojamentos), só têm é de substituir as palavras column e table, por um campo e uma tabela (tem de ser a mesma tabela que contém o campo) da vossa base-de-dados. O resultado será (quase) sempre diferente. Claro que convém ter muitos registos nessa tabela para se poder ver os resultados aleatórios a aparecer.

ACTUALIZAÇÃO:

Chamo a atenção para o seguinte: se quiserem obter os dados de todas as colunas (campos = fields) de uma linha (registo = row) terão de usar uma instrução SQL ligeiramente diferente.

(Doutra forma, apenas conseguiriam obter o conteúdo da coluna seleccionada com a anterior instrução SQL.)

SELECT * FROM table ORDER BY RAND() LIMIT 1

Reparem que o SELECT é feito por todas as colunas (é o que * ‘asterisco’ significa: todas as colunas, neste caso; mas também pode ser utilizado para seleccionar todos os registos), quando dantes, apenas seleccionava uma coluna.

/FIM DA ACTUALIZAÇÃO

Como tudo em informática, há várias outras formas de resolver o problema. Podia ter usado a função rand() do PHP para conseguir o mesmo objectivo.

Basta irmos ao site oficial da linguagem de programação PHP e pesquisar “rand()” na lista de funções e vamos encontrar a seguinte página: PHP: rand.

Esta função funciona duma forma bastante simples.
rand( vazio )
rand (int $min int $max)

Podemos chamá-la sem nenhum argumento, ou com dois argumentos opcionais que funcionaram com limitadores do valor mínimo e máximo. Em vazio “rand()” vai retornar um valor entre 0 e RAND_MAX (uma constante própria do PHP que tem limites em algumas plataformas).

Se preenchermos os argumentos mínimo e máximo, retorna-nos um valor entre esses valores: “echo rand(22, 45);” – resultado “29” (é só um exemplo).

Isto tudo para dizer que podia usar esta função PHP para conseguir um valor aleatório. Usá-lo numa query à minha base-de-dados MySQL, seleccionando o registo (row) com o ID igual ao resultado da função rand().

One thought to “Seleccionar um registo aleatório duma base-de-dados MySQL”

  1. ACTUALIZAÇÃO:

    Chamo a atenção para o seguinte: se quiserem obter os dados de todas as colunas (campos = fields) de uma linha (registo = row) terão de usar uma instrução SQL ligeiramente diferente.

    (Doutra forma, apenas conseguiriam obter o conteúdo da coluna seleccionada com a anterior instrução SQL.)

    SELECT * FROM table ORDER BY RAND() LIMIT 1

    Reparem que o SELECT é feito por todas as colunas (é o que * ‘asterisco’ significa: todas as colunas, neste caso; mas também pode ser utilizado para seleccionar todos os registos), quando dantes, apenas seleccionava uma coluna.

    /FIM DA ACTUALIZAÇÃO

    Post actualizado.

Comments are closed.