Optimisation de la BDD - SQL/NoSQL - Programmation
Marsh Posté le 15-06-2017 à 13:58:38
Bonjour,
Stock les niveaux fini d'un joueur, ça te fera donc une liste puis quand tu fais ta requête tu la fais pour récupérer un niveau aléatoirement parmi les niveaux qui ne sont pas dans la liste
Si tu veux des conseils plus précis, il faut nous donner plus d'information.
Marsh Posté le 15-06-2017 à 14:18:34
En gros, voilà comment je pensais faire cela :
Table A : ID_niveau, ...
Table B : ID_user, ID_niveau, Date_resolution, ...
Chaque niveau résolu génère un enregistrement dans la table B.
ET ENSUITE ?
Peut-on faire une seule requete SQL
ou
Faut-il faire une première requête pour récup les niveaux résolus, déduire en php un niveau non résolu et faire une deuxième requête avec l'ID niveau ?
Marsh Posté le 15-06-2017 à 14:35:46
Regardes du côté de Table A LEFT JOIN Table B ON (A.ID_niveau = B.ID_niveau)
Marsh Posté le 16-06-2017 à 13:59:31
Merci pour votre aide.
J'avoue que je n'ai jamais utilisé "left join" en SQL et que j'ai du mal à piger le principe même après avoir vu la doc dessus.
Mais du coup, le faire en une seule grosse requête est plus rapide/optimisée que d'en faire 2 plus légères ?
Marsh Posté le 16-06-2017 à 15:37:15
Ca sera sans doute plus rapide avec une seul requête puisque pas besoin de passer par du code php ou autre. Tout se fait en SQL.
Le LEFT JOIN permet de lister les enregistrements de la table A avec des données se trouvant dans la table B si la jointure spécifiée dans la clause ON () trouve une correspondance. Si pas de correspondance, pour les champs de la table B spécifiés dans le SELECT, on aura la valeur NULL.
Marsh Posté le 24-06-2017 à 13:51:45
Merci pour ta réponse. Je veux bien un coup de main pour la requête SQL car entre le LEFT JOIN à faire et retourner un seul ID de manière aléatoire, je m'en sors pas.
Exemple de BDD
Table A : ID_niveau
1
2
3
4
5
-----
Table B : ID_user, ID_niveau_resolu
1, 2
1, 5
-----
Quelle serait la requête SQL pour retourner aléatoirement un ID_niveau non résolu pour le user 1 ?
Dans l'exemple ci-dessus, l'ID retourné ne peut être que 1, 3 ou 4 (le 2 et le 5 étant déjà résolu)
Marsh Posté le 24-06-2017 à 18:48:53
Tu mets rand() dans la clause ORDER BY et un limit 0,1
Marsh Posté le 24-06-2017 à 20:05:33
ok mais alors la requête ressemble à quoi avec le left join et le rand ?
Marsh Posté le 25-06-2017 à 22:35:29
SELECT A.ID_niveau, B.ID_niveau_resolu FROM A LEFT JOIN B ON (A.ID_niveau = B.ID_niveau_resolu) HAVING B.ID_niveau_resolu IS NULL ORDER BY RAND() LIMIT 0,1
Marsh Posté le 15-06-2017 à 13:44:37
Bonjour,
J'ai une question sur comment organiser ma base de données SQL.
C'est un petit jeu avec de nombreux niveaux. Les niveaux du jeu sont mélangés d'un joueur à l'autre. Une fois qu'il a résolu un niveau, il passe à un autre (aléatoire).
Quelle est la meilleure façon de faire cela ?
Lorsque le joueur aura résolu 1500 niveaux parmi 2000, j'ai peur que les requêtes soient très lourdes pour trouver un niveau non résolu.
Merci d'avance pour votre aide
(pas besoin de me coder le truc, c'est une question purement théorique afin d'optimiser la base et les requêtes)