Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les forums > Site Web > PHP > [SQL]Eviter un LIMIT > Lecture du sujet

[SQL]Eviter un LIMIT

Vous devez être inscrit pour pouvoir poster des messages

RésoluLe problème de ce sujet a été résolu

Page : 1 
Auteur Message
1 visiteur sur ce sujet (1 anonyme)
Page : 1 
Hors ligne IgiX # Posté le 13/10/2008 à 21:56:14
Qui tente rien, n'a rien!
Avatar
Groupe : Membres
Bonsoir!

Voilà mon p'tit problème et son contexte.
Je suis en train de créer un forum pour mon site, et j'aimerai le rendre le plus lite possible et là je bloque.
Je voudrais faire une liste de mes topics mais sans un LIMIT qui est très lourd (je vous apprends rien en vous disant qu'il sélectionne toutes les entrées et les tries juste après). Donc je me demande comment pourrais-je faire faire sans utiliser ce LIMIT.

Donc voilà, merci d'avance.

IgiX

Amicalement IgiX
 
Hors ligne melimelo # Posté le 13/10/2008 à 21:58:54
Avatar
Groupe : Membres
Ben je pense pas qu'il soit possible de faire un Limit de 36 manière différentes, ni qu'il en existe 3000 équivalents.

Je penses que tu n'as pas beaucoup le choix ...

Cordialement Melimelo

Ah okey :noel:
 
Hors ligne IgiX # Posté le 13/10/2008 à 22:01:12
Qui tente rien, n'a rien!
Avatar
Groupe : Membres
Roh, mais le forum du sdz, je sais qu'il n'en utilise pas !

Amicalement IgiX
 
Hors ligne melimelo # Posté le 13/10/2008 à 22:09:18
Avatar
Groupe : Membres
Ah bon o_O ??

Ils sont pas passé sous PostGreSql le sdz non ? ^^

C'est peut-être pour ca :p

Ah okey :noel:
 
Hors ligne IgiX # Posté le 13/10/2008 à 22:11:37
Qui tente rien, n'a rien!
Avatar
Groupe : Membres
non, non, en surfant y a un bout de temps, j'avais trouvé "une partie" des brouillons qui avaient servi à la partie SQL du forum...

Amicalement IgiX
 
Hors ligne Tracker # Posté le 13/10/2008 à 22:16:57
Avatar
Groupe : Membres
Calcule (efficacement) un numéro de page à la création de chaque post sur lequel tu mets un indexe.
Les sélection paginées seront de fait optimisées.


Tracker.

Un peu de lecture: PHP // MySQL // JavaScript // w3schools // SQL
 
Hors ligne IgiX # Posté le 13/10/2008 à 22:21:04
Qui tente rien, n'a rien!
Avatar
Groupe : Membres
Tracker, tu pourrais pas m'indiquer un endroit où on en parle, car je ne comprends que de loin le concept (a vue d'oeil certains point me trottinent dans la tête

Amicalement IgiX
 
Hors ligne Tracker # Posté le 13/10/2008 à 22:42:44
Avatar
Groupe : Membres
Ben nulle part, ça parait logique, tu fais un limit pour limiter une selection. Quel autre moyen as-tu à part affecter les éléments à un indexe représentant un numéro de page ?


Tracker.
Édité le 13/10/2008 à 22:49:44 par Tracker

Un peu de lecture: PHP // MySQL // JavaScript // w3schools // SQL
 
Hors ligne jaye # Posté le 14/10/2008 à 00:29:04
Avatar
Groupe : Membres
Citation : IgiX
(je vous apprends rien en vous disant qu'il sélectionne toutes les entrées et les tries juste après)

un LIMIT ne fais pas de tri pourtant o_O
quelles sont tes sources ?
 
Hors ligne harcher81 # Posté le 14/10/2008 à 00:44:25
Et oui, c'est moi
Avatar
Groupe : Membres
L'idée de tracker est simple et peut très bien fonctionné, mais je pense que le sdz fait autrement.

Il doit y avoir une id unique statique et un id dynamique, lorsque tu poste un nouveau topic tu fais à id dynamique un +1 sur le dernier (comme normalement). Ensuite tu détermines avec le where quel id prendre (avec quelques calculs c'est facile). Le problème si un topic est supprimmé ou quel quelqu'un poste un nouveau message et bien il manquera un topic dans une page. Le truc c'est de refaire l'id dynamique à chaque message, tu fait -1 à tous els id plus grand que X et le topic X devient le dernier id. Un économie à l'affichage, mais pas à l'enregistrement, comme l'enregistrement représente moins de 5%, un gain considérable.

Citation : jaye
Citation : IgiX
(je vous apprends rien en vous disant qu'il sélectionne toutes les entrées et les tries juste après)

un LIMIT ne fais pas de tri pourtant o_O
quelles sont tes sources ?

Tu peux faire de recherche, mais le limit justement ne trie pas, il récupèrent tout pour ensuite envoyer que les X derniers.
Édité le 14/10/2008 à 00:46:13 par harcher81

Image utilisateur
Image utilisateur
 
Hors ligne IgiX # Posté le 14/10/2008 à 07:22:19
Qui tente rien, n'a rien!
Avatar
Groupe : Membres
en gos, je doit réorganiser ma table à chaque nouveau message, ca me paraît lourd, mais, c'est plus light niveau affichage

Amicalement IgiX
 
Hors ligne Tracker # Posté le 14/10/2008 à 08:44:05
Avatar
Groupe : Membres
C'est pas forcement la peine tout complexifier pour:
Citation
[...]Le problème si un topic est supprimmé ou quel quelqu'un poste un nouveau message et bien il manquera un topic dans une page[...]


Sachant que tu peux:
- marquer l'élément comme verrouiller, déplacé etc... (l'entrée existant toujours).
- supprimer l'élément physiquement: Question dans le SDZ, sur une liste d'à priori 50 entrées par page qui va aller vérifier qu'en définitive il n'y en a pas que 49 ou 48 ??


Tracker.
Édité le 14/10/2008 à 12:03:31 par Tracker

Un peu de lecture: PHP // MySQL // JavaScript // w3schools // SQL
 
Hors ligne Savageman # Posté le 14/10/2008 à 12:01:07
Insa : If inside
Avatar
Groupe : Membres
Cette réponse a aidé l'auteur du sujet Cette réponse a aidé l'auteur du sujet
Autre technique :
Tu as un numéro d'ordre pour chaque topic.
Le premier topic posté à le numéro 1.
Le deuxième topic posté à le numéro 2.
Le 3ème topic posté à le numéro 3.

Si tu postes un message dans le topic 1 (le plus vieux). Celui-ci doit avoir le numéro d'ordre le plus élevé afin d'apparaître en premier. Tu sélectionnes donc le plus élevé, tu décrémentes tous les topics dont le numéro d'ordre est plus grand que l'ordre du topic courant, puis tu attribues le numéro d'ordre le plus grand au topic courant.

Exemple (parce que ça n'est pas forcément clair).

Topic | Ordre
1 | 1
2 | 2
3 | 3

Si tu postes un message dans le topic 1, tu fais :
a) Récupère le plus grand Ordre existant (à savoir 3).
b) Décrémente tous les numéros d'ordre plus grand que l'ordre du topic courant (plus grand que 1 donc).
c) Tu attribues le numéro d'ordre récupéré en a) au topic courant.

Tu obtiens ceci :
1 | 3
2 | 1
3 | 2

Lorsque tu tries tes sujets en ordre déccroissant, tu auras donc "topic 1", "topic 3", puis "topic 2".
Pour sélectionner les X derniers topics, tu fais ceci :
a) récupérer l'ordre le plus grand O.
b) récupérer les topics dont l'ordre est compris entre O et O-X (sans LIMIT donc).

Après, tu as toutes les subtilités de déplacement de sujet, de suppression de sujet. Je te laisse voir ce qui doit se passer dans ce cas (ça n'est pas bien bien compliqué ;) ).
 
Hors ligne IgiX # Posté le 14/10/2008 à 16:23:16
Qui tente rien, n'a rien!
Avatar
Groupe : Membres
il me semble que la methode de Savageman serais moins lourde :D

Merci quand même Tracker ;)

Amicalement IgiX
 
Hors ligne Savageman # Posté le 14/10/2008 à 16:24:40
Insa : If inside
Avatar
Groupe : Membres
La méthode de Tracker est bien adaptée pour les messages d'un sujet sinon. ;)
 
Hors ligne Tracker # Posté le 14/10/2008 à 16:41:42
Avatar
Groupe : Membres
Ta méthode implique des modifications par lots, donc des locks, car si deux utilisateurs postent en même temps >[Tu sélectionnes donc le plus élevé] ils obtiendront la même valeur (et donc un bug). Une simple jointure classant les posts par numéro décroissant de message est suffisante, ce qui n'interdit en rien d'affecter une page (approximative) à un message pour permettre une pagination.


Tracker.
Édité le 14/10/2008 à 16:45:49 par Tracker

Un peu de lecture: PHP // MySQL // JavaScript // w3schools // SQL
 
Hors ligne IgiX # Posté le 14/10/2008 à 16:48:04
Qui tente rien, n'a rien!
Avatar
Groupe : Membres
bah, je fais un SELECT MAX(ordre) et j'insc remente et avant, je compte si il y a double entrée et puis si y a 51 messages au lieu de 50, qui ira compter :D

Amicalement IgiX
 
Hors ligne Tracker # Posté le 14/10/2008 à 16:54:02
Avatar
Groupe : Membres
Deux utilisateurs, si tu ne fais rien, risquent de se retrouver avec un SELECT MAX retournant la même valeur, ce qui pose problème à l'algo de Savageman (création de trous ou plantage). Donc soit, tu lockes (mais quoi ?) soit tu tolères l'erreur...

Tracker.
Édité le 14/10/2008 à 16:54:24 par Tracker

Un peu de lecture: PHP // MySQL // JavaScript // w3schools // SQL
 
Hors ligne Savageman # Posté le 14/10/2008 à 18:00:44
Insa : If inside
Avatar
Groupe : Membres
Oui bah... Il faut bien entendu utiliser des transactions hein !
 
Hors ligne IgiX # Posté le 14/10/2008 à 18:22:03
Qui tente rien, n'a rien!
Avatar
Groupe : Membres
Ouai
Édité le 14/10/2008 à 18:27:08 par IgiX

Amicalement IgiX
 
Hors ligne Tracker # Posté le 14/10/2008 à 18:27:37
Avatar
Groupe : Membres
Citation : Savageman
Oui bah... Il faut bien entendu utiliser des transactions hein !


Les transactions ne gèrent en rien les problèmes d'exclusivité. Tu pourras mettre autant de "begin" que tu voudras dans ton code, le "SELECT MAX" précédent aura le même comportement.


Tracker.

Un peu de lecture: PHP // MySQL // JavaScript // w3schools // SQL
 
Hors ligne IgiX # Posté le 14/10/2008 à 19:28:39
Qui tente rien, n'a rien!
Avatar
Groupe : Membres
bah tu veux pas me faire le script :p

Amicalement IgiX
 
Hors ligne irnine94 # Posté le 14/10/2008 à 21:36:14
irnou de l'iglo0
Avatar
Groupe : Membres
Salut,

Désolé de remonter ce sujet avec deux heures de retard, mais je crois que l'auteur cherchait ce poste :
http://www.siteduzero.com/forum-83-144 [...] mps-reel.html
Le dernier de la page. ;)

Un homme, c'est comme un chat : Dès qu'on le caresse, sa queue se dresse.
Forum téléchargeable style JeuxVideo.Com, script libre, gratuit et autorisé : Forum d'exemple, scripts (.zip), fichier d'aide.
 
Hors ligne Jeremie64 # Posté le 15/10/2008 à 00:12:26
Get over it !
Avatar
Groupe : Membres
http://www.siteduzero.com/forum-83-298 [...] it-mysql.html


Coding is more than a job, more than hobby, more than activity, it's a lifestyle !

PHP is a powerful programming language, if you know how to use it...



 

Retour au forum "PHP" ou à la liste des forums

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 103 Zéros connectés | Requêtes SQL 9 requêtes | Temps de génération de la page : Total (SQL) 0.058s (0.0424s)