/ / mysql aleatorio menos usado - mysql

mysql aleatorio menos usado - mysql

Necesito seleccionar un registro al azar pero no uno ya seleccionado antes, a menos que se hayan seleccionado todos los registros.

Configuración de la tabla: _word (id, nam) _word_tm (id, word_id, tm)

Cada vez que se usa una palabra, se carga en _word_tm. Lo que quiero hacer es asegurarme de usar todas las palabras antes de reutilizar una palabra ya usada.

Lo que realmente estoy buscando es algo como lo que se muestra a continuación, pero solo estoy tratando de averiguar cómo combinar.

seleccione w.nam FROM _word w LEFT JOIN _word_tm wt ON w.id = wt.word_id ORDER BY conteo (wt.id) asc, rand () límite 1

Respuestas

1 para la respuesta № 1

Primero, averigüe cuántas veces se han usado las palabras menos usadas:

select _word.id, count(*) c from _word
left join _word_tm on _word.id=_word_tm.word_id order by c limit 1;

Almacenar ese valor (de c) en una variable $least_used. Luego consigue todas las palabras que se usan muchas veces, en orden aleatorio:

select _word.id, count(*) c from _word
left join _word_tm on _word.id=_word_tm.word_id
group by _word.id having c <= {$least_used}
order by rand() limit 1;

0 para la respuesta № 2

Deberías poder hacer algo como esto:

SELECT * FROM word_table WHERE word NOT IN (SELECT word FROM words_used) ORDER BY rand() LIMIT 1;

Necesitará tener una copia actualizada de MySQL para que esto funcione. Además, deberá incluir una línea de código después o antes para borrar / restablecer su words_used mesa una vez que tenía el mismo contenido que word_table.


0 para la respuesta № 3

Puedes probar el siguiente SQL para devolver una fila aleatoria

select A.nam
from _word A
where A.id not in (select B.id from _word_tm B)
order by rand()
limit 1

Si lo anterior no devuelve ninguna rebaja, haz una simple

select A.nam
from _word A
order by rand()
limit 1