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. P>
Les tables ressemblent à ceci comme ceci p> donc si je voulais interroger la base de données pour le 10 Plus récemment ajouté, j'irais avec quelque chose comme ceci: p> 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? p> 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): p> 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. P> Y a-t-il une meilleure façon Pour atteindre ce que je cherche? (pagination précise). p> p>
4 Réponses :
Il y a quelques façons de résoudre ce problème: p>
emplacement_information code> enregistrement avec cet ensemble sur 1. li>
- 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 code> si vous n'avez pas daecreated code> ou < Code> DateNodified Code> Colonnes. LI>
ul> 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}) CODE> P>
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.
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)
;
É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!
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.