0
votes

MySQL: Comment compter les ensembles d'enregistrements de données sur la base du numéro de révision le plus élevé?

Les entrées individuelles de ma base de données MySQL 5.7 permettent de révision via PHP: les ensembles d'enregistrements de données déjà enregistrés peuvent donc être actualisés. Pour chaque réalisation unique, ce qui n'est rien d'autre que d'enregistrer le même jeu d'enregistrements de données N fois, un numéro de révision est automatiquement défini (il commence par 0):

+-------------------+-----------------------------------------------------+
| blahblahblah      | COUNTs of blahblahblah / latest revision numbers    |
+-------------------+-----------------------------------------------------+
| Appendectomy      | 3854                                                |
| Lap Appendectomy  | 1473                                                |
| ...               | ...                                                 |
| Colostomy         | 563                                                 |
| Different Surgery | 2534                                                |
+-------------------+-----------------------------------------------------+


8 commentaires

J'ai l'impression que nous avons couvert cela. Pour un recyclage, voir: Pourquoi devrais-je fournir un MCVE pour ce qui me semble être une question de SQL très simple?


Non, nous n'avons pas converti la deuxième partie de ma question, @ Sstrowberry, nous venons de vérifier le filtrage pour le dernier numéro de révision en dehors de la requête du compte. Toutes les informations requises existent maintenant également selon la MCVE.


Qu'est-ce que le 1 représente dans cette requête? Sélectionnez 1 à partir de Surgiry_Table OP2 où op2.patid = p.patientid et op2.Revision> op.Revision


@KebabProgrammer: Veuillez vous reporter à Stackoverflow.com/questions/7171041/... et dba.stackexchange.com/questions/159413/... .. Vous pouvez remplacer le" 1 "avec essentiellement n'importe quoi autre.


Certains Sidenotes: Dans votre première requête, vous essayez de rejoindre externe, mais p.patientid = op.patid dans votre où la clause rend cette simple jointure intérieure. Ensuite, vous appliquez distinct et je n'ai pas la moindre idée de ce que vous voulez réaliser avec cela. Dans votre deuxième requête, vous confondez des citations simples et doubles. Les devis doubles sont destinés à des noms, citations simples sont pour les littéraux.


Merci, @thorstenkettner, pour vos observations, vous avez raison. Je vérifie la requête après des changements ...


Peut-être qu'il existe, mais ce n'est pas là.


Le distinct pourrait être superflu ou même faux ici, mais cela n'affecte pas le résultat quantitatif - les nombres résultants sont les mêmes, @thorstenkettner. J'ai changé les citations simples et doubles (pas ici), en conséquence. Je vais vérifier dans vos autres réponses maintenant et les commenter individuellement.


3 Réponses :


1
votes

Le dernier enregistrement de chirurgie par patient peut être assez facilement avec agrégation: xxx pré>

et bien sûr, vous pouvez agréger ces enregistrements: P>

select
  sum(blahblahblah = 0) as no_surgery,
  sum(blahblahblah = 1) as lap_appendectomy,
  ...
from surgery_table
where (patientid, revision) in
(
  select patientid, max(revision)
  from surgery_table
  where surgerydate between date '2000-01-01' and date '2020-12-31'
  group by patientid
);


1 commentaires

Merci beaucoup, la deuxième requête SQL fait le travail bien (avec la seule exception que je reçois 4 records trop nombreux, mais c'est quelque chose de mise à la terre avec des détails minuscules, j'ai toujours besoin de regarder).



1
votes

Votre deuxième requête récupère une ligne avec de nombreuses colonnes (une pour chaque traitement). Votre résultat attendu montre une ligne em> par traitement, ce que j'aime beaucoup mieux.

Votre base de données semble manquer d'une table de traitement. Créez une: P>

select t.treatment, t.description, count(s.id)
from treatment t
left join surgery_table s using(treatment_id)
where (s.patientid, s.revision) in
(
  select patientid, max(revision)
  from surgery_table
  where surgerydate between date '2000-01-01' and date '2020-12-31'
  group by patientid
)
group by treatment_id
order by treatment_id;


2 commentaires

Merci encore, en effet. Oui, une telle table existe, je ne l'ai pas affichée ici, cependant. Je vérifierai votre requête SQL proposée.


Transformer cela en ma bonne requête SQL fonctionne aussi bien. Une approche très élégante pour manipuler des choses. Merci encore, Thorsten.



1
votes

Dans une requête Vous utilisez la clause à partir de (y compris toutes les jointures) pour affirmer où vous souhaitez des données de et le clause de la clause .

Donc, si vous souhaitez travailler sur les mêmes données, remplacez votre à partir de et clause. C'est à dire. Supprimer xxx

de votre deuxième requête et remplacez-le par xxx

une alternative consiste à sélectionner dans une requête: xxx


2 commentaires

Merci pour votre aimable explicite. J'ai compris toutes vos réponses. Celui-ci est particulièrement utile également pour d'autres requêtes que je joue dans mon système. J'apprécie vraiment votre aide, Thorsten.


Cette approche fournit les résultats exacts à prévoir (attente: Je connais le nombre absolu de patients et que 100% des patients ont reçu une intervention chirurgicale). Excellent , Thorsten!