8
votes

Pagination précise avec des jointures gauche

J'ai pensé à cela depuis un moment et que ce qui est arrivé à un point où je pense que c'est mieux de se poser autour de lui et d'écouter ce que les autres pensent.

im en bosse un système qui stocke des emplacements sur MySQL. Chaque emplacement a un type et certains emplacements ont plusieurs adresses.

Les tables ressemblent à ceci comme ceci xxx

donc si je voulais interroger la base de données pour le 10 Plus récemment ajouté, j'irais avec quelque chose comme ceci: xxx

droite? Mais le problème est que si un emplacement a plus de 1 adresse, la limite / la pagination ne sera pas accueillée, à moins que je "regroupe L.Location_ID", mais cela ne montre qu'une seule adresse pour chaque lieu .. Que se passe-t-il Avec les endroits qui ont plusieurs adresses?

Alors je pensais que la seule façon de résoudre ce problème est de faire une requête à l'intérieur d'une boucle. Quelque chose comme ça (pseudocode): xxx < / Pré>

Maintenant, je reçois les 10 derniers endroits, mais en faisant que je me retrouve avec au moins 10 requêtes plus, et je ne pense pas que cela aide la performance de l'application.

Y a-t-il une meilleure façon Pour atteindre ce que je cherche? (pagination précise).


1 commentaires

Quelle adresse (enregistrement local_information) voudriez-vous revenir pour un emplacement? Si vous pouvez dire lequel vous voulez, nous pouvons dire à l'ordinateur celui que vous voulez.


4 Réponses :


2
votes

Il y a quelques façons de résoudre ce problème:

  • Vous pouvez ajouter une colonne de bit iSprimary à la table emplacement_information et ajoutez une gâchette pour vous assurer que chaque emplacement n'a toujours qu'un seul emplacement_information enregistrement avec cet ensemble sur 1.
  • Vous pouvez sélectionner le fichier emplacement ou le plus ancien ou le plus récent> enregistrement (min / max), à l'aide de la colonne emplacement_id si vous n'avez pas daecreated ou < Code> DateNodified Colonnes.

0 commentaires

3
votes

meilleur que la boucle et 10 requêtes, vous pouvez interroger pour l'emplacement.Location_id Limite 10 pour la pagination, concaténate que dans une chaîne séparée par des virgules puis la requête complète pour obtenir où emplacement.location_id in (1,2 , 3 ... {Liste des IDS})


0 commentaires

3
votes

Vous pouvez aller avec votre pensée originale sur le regroupement par l'emplacement_id, puis utilisez la fonction Group_ConCAT pour afficher toutes les adresses de cet emplacement sous forme de champ. XXX


0 commentaires

21
votes

Voici votre requête d'origine

SELECT k.location_id, k.location_name, 
       t.type_id, t.type_name, 
       i.location_address, i.location_phone 
FROM
    (SELECT location_id,location_type_id,location_name
    FROM location ORDER BY location_id LIMIT 10,10) AS k
    LEFT JOIN location_information AS i ON (k.location_id = i.location_id) 
    LEFT JOIN location_types AS t ON (k.location_type_id = t.type_id) 
;


2 commentaires

Étant donné que le fait d'utiliser une limite croissante pourrait être coûteux après plusieurs pages, l'idée principale est bonne.


Merci! C'est le genre de requête que je cherchais, je n'ai jamais franchi mon esprit pour faire une sous-requête comme ça!