J'ai une table dans ma base de données qui a 3 colonnes: id, name, category_id qui a 1 million de lignes. l'utilisateur sélectionne un category_id dans l'application, puis la base de données doit renvoyer 12 lignes qui ont le category_id sélectionné. puis dans le prochain appel d'API, la base de données doit renvoyer les 12 prochaines lignes qui ont le category_id sélectionné et ainsi de suite.

Ma question est de savoir comment puis-je renvoyer les lignes au hasard et éviter de renvoyer des lignes répétées lors des prochains appels d'API ?

1
Soheil 13 avril 2020 à 16:17

2 réponses

Meilleure réponse

Vous recherchez un tri aléatoire répétable. Pour cela, vous pouvez utiliser RAND() avec une graine. L'idée est que chaque recherche doit se voir attribuer une valeur de départ constante (que vous pouvez persister dans la session de l'utilisateur, par exemple).

En supposant qu'un utilisateur a une valeur de départ 12345, vous pouvez récupérer sa première page comme:

select * from mytable where category_id = ? order by rand(12345) limit 12

Ensuite, la deuxième page est récupérée comme suit:

select * from mytable where category_id = ? order by rand(12345) limit 12, 12

Troisième page:

select * from mytable where category_id = ? order by rand(12345) limit 24, 12

Etc.

1
GMB 13 avril 2020 à 13:34

En supposant que id est une clé de la table et n'a que des valeurs positives, vous pouvez faire:

select id, name, category_id
from my_table
where category_id = ? and id > ?
order by id
limit 12

La première fois que vous l'appelez, vous pouvez utiliser:

  • category_id = 123
  • id = -1

La deuxième fois, vous obtenez le max id d'avant (disons 25) et utilisez celui-là.

  • category_id = 123
  • id = 25
1
The Impaler 13 avril 2020 à 13:35