0
votes

Mysql - conditionnel min max pour renvoyer un enregistrement distinct

J'ai une passe de base de données de Le site Web de Geonames pour la Grande-Bretagne . Il se compose d'environ 60000 enregistrements. Exemple de données est la suivante:

id      | name
---------------------------
2652355 | Cornwall, England


0 commentaires

3 Réponses :


0
votes

dans MySQL, vous pouvez utiliser une sous-requête corrélée: xxx pré>

dans mysql 8+, vous pouvez également utiliser row_number () code>: p>

select l.*
from (select l.*,
             row_number() over (partition by name 
                                order by (feature_code = 'RGN') desc, id
                               ) as seqnum
      from locations l
     ) l
where seqnum = 1;


3 commentaires

J'ai mis à jour mon message mais je ne comprends pas comment je peux appliquer votre première requête à la recherche par nom?


@ adam78. . . Vous alliez simplement ajouter et au où la clause .


désolé je ne comprends pas ça. Pourriez-vous mettre à jour votre réponse en utilisant le SQL que j'ai posté afin que je puisse comprendre ce qui se passe?



0
votes

Une approche pourrait être existante et syndicat tout xxx


7 commentaires

Remarque Il pourrait y avoir plusieurs lignes avec le même nom, mais différentes codes_codes_surfi, donc je aurais besoin de la requête pour être dynamique.


@ adam78 Ma réponse couvrira votre énoncé de problème décrire afin que vous ayez un modèle de données d'autre, je pense que vous devez décrire cela dans la description.


Je souhaite rechercher des enregistrements par des noms de lieu - j'essaie de construire une recherche automatique. Lorsque les noms sont les mêmes, je veux vous assurer que la recherche renvoie le disque distinct mais en utilisant les critères comme décrit.


@ Adam78 Cela fonctionnera pour n'importe quel nom de lieu et vous pouvez rechercher simplement en ajoutant une condition et un nom comme "Cornwall%"


J'ai mis à jour mon message avec le SQL que j'utilise pour mieux décrire ce que j'essaie d'atteindre. Pouvez-vous mettre à jour votre réponse en utilisant le SQL dans mon message s'il vous plaît.


Essayez d'utiliser un cas instruction pour renvoyer une colonne que vous pouvez utiliser pour déterminer la valeur pour la fonction_code_code - quand = la région 1 ore 0, puis vous pouvez utiliser Existe / / / / / / n'existe pas pour inclure ou exclure les lignes en fonction de l'existence de 1 et 0


Si vous souhaitez que le code SQL réelle, vous aurez besoin de fournir plus de données - vous avez mentionné quatre niveaux dans votre requête, mais ont uniquement fourni deux dans votre exemple de données. Provivife un exemple plus complet. Je suis intéressé par exemple pour comprendre comment la couche Adm3 s'applique dans votre exemple.



1
votes

Je pense que l'agrégation conditionnelle em> devrait faire l'affaire. Vous pouvez filtrer des enregistrements par nom code>, puis appliquez la logique dans les fonctions d'agrégat. Si un enregistrement existe avec Feature_Code = 'RGN' code>, vous souhaitez le sélectionner, sinon vous choisiriez le minimum ID code> dans l'enregistrement correspondant.

| id       | name     | admin1 | admin2 | admin3 | feature_class | feature_code |
| -------- | -------- | ------ | ------ | ------ | ------------- | ------------ |
| 11609029 | Cornwall | ENG    |        |        | L             | RGN          |


0 commentaires