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 № 1Primero, 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