7
votes

Besoin d'aller chercher un enregistrement pour chaque mois dans MySQL

J'ai besoin d'aide pour récupérer l'enregistrement de la base de données avec une certaine condition, car j'explique ci-dessous: -

Je dois vérifier la disponibilité des étudiants pour chaque mois entre le démarrage sélectionné et la date de fin.

Structure de table : -

 Entrez la description de l'image ici

Données de table: -

 Entrez la description de l'image ici

Exemple: -

Ici, vous pouvez prendre des capacités de classe comme 20 étudiants par exemple.

Je veux vérifier la disponibilité du siège du 02/2016 à 04/2017.

La sortie sera la suivante: xxx

Merci d'avance pour l'aide.


2 commentaires

Comment 05/2016 - 15 ? Il n'y a que trois entrées indiquées dans la capture d'écran


Ceci est juste un exemple @kamalpal


5 Réponses :


7
votes

J'ai trouvé votre question comme celle-ci s'il y a un certain nombre d'élèves et qu'ils peuvent s'inscrire à tout moment dans le mois, cela n'est pas pris en compte, mais si vous pouvez décider que cela comparera à une date de démarrage ou deddate cette requête vous aidera certainement à vous aider. .

SELECT count(*) as cnt,CONCAT(MONTH(startDate),'/',  YEAR(startDate)) as day from notes group by day 


4 commentaires

Oui, cela aidera quelque peu, mais où est l'autre record du mois?


Par exemple, je n'ai pas d'entrée pour le 05/2016, alors il retournera 0 pour ce mois-ci.


Pouvez-vous m'aider à cela? @khajaamin


Supprimer l'année () fonction de Concat si vous n'avez pas besoin ou d'expliquer ce qui est un cas d'utilisation réel.



2
votes

Vous devez utiliser une sous-requête ou une jointure auto pour obtenir les résultats requis, voir Exemple ci-dessous: xxx pré>

sortie (sur la base des enregistrements présentés dans la capture d'écran): P>

+---------+---------+-----------------+
| startMY | endMY   | balanceCapacity |
+---------+---------+-----------------+
| 2015-12 | 2017-07 |              19 |
| 2016-03 | 2017-04 |              18 |
| 2016-05 | 2017-03 |              17 |
+---------+---------+-----------------+


4 commentaires

Mais toujours avec votre réponse, vous ne pouvez pas obtenir le résultat pour le mois qui n'ont aucun enregistrement.


@Harshsanghanghani Je ne pense pas que MySQL va vous chercher des dates qui n'existe pas dans la table de base de données, mais vous pouvez facilement vérifier la date dans la liste s'il n'existe pas Balancecapacity = 20


J'ai besoin d'aide pour cette question uniquement autrement, je peux également obtenir le résultat pour le résultat existant, BTW merci beaucoup pour votre aide.


@HARSHSANGHANI GRAND, vous pouvez poster une réponse alors (sinon existe), il serait utile pour les futurs visiteurs.



1
votes

On dirait qu'il y a quelques personnes ici avec des solutions qui vous donneront des résultats pendant des mois qui ne sont pas entièrement libres (s'ils sont entièrement libres, aucune ligne n'est retournée).

Une bonne solution serait de renvoyer les chiffres occupé pour chaque mois, dans votre code, créez une liste de mois dans la gamme que vous vous souciez et soustrayez les résultats de votre requête à partir de la valeur «entièrement libre» de la valeur correspondante par défaut du mois.

mais si c'est Vraiment important que vous fassiez cela purement dans MySQL pour une raison quelconque, il n'y a pas de moyen général de dire «Donnez-moi une liste de valeurs dans une gamme donnée», mais si vous n'êtes pas opposé à la construction d'une liste de mois, vous vous souciez d'exécuter avant d'exécuter La requête, vous pouvez probablement le faire avec une relevé syndicale grand et une jointure gauche, par exemple: xxx

etc .. ce qui précède devra être fortement modifié pour corriger la colonne ambiguë noms etc et ajouter dans la logique afin que tous les rendez-vous étudiant chevauchant une année et un mois donnés sont inclus dans les comptes et il comptait correctement ... le Autres réponses déjà faites cela, je ne me dérangerai pas de le refaire :)

Juste une pensée sur une éventuelle approche, ce qui précède n'est pas destiné à être pris directement comme une réponse. >


0 commentaires

1
votes

Pour cette question, une petite démo a été mise en place.

Basé sur vos captures d'écran de base de données  Entrez la description de l'image ici Entrez la description de l'image ici

exemple de schéma de table, de données et de requêtes xxx

Cette requête vous obtiendra les sièges restants disponibles Dans chaque classe basée sur votre mois et année paires. xxx

Vous pouvez vérifier l'exemple de résultats dans SQL Fiddle


0 commentaires

1
votes

Vous devez utiliser PHP pour obtenir le compte pour chaque mois de la plage, SQL seul ne retournera pas les données dont vous avez besoin (facilement).

Utilisez SQL pour retourner un ensemble de résultats contenant tous les étudiants qui ont commencé avant votre gamme. Ou s'est terminé après votre plage.

supposer que votre gamme de requêtes commence par $ fratDate et se termine par $ todate xxx < / Pré>

Ensuite, utilisez PHP pour déterminer le nombre de sièges pris pendant chaque mois de votre gamme.

essentiellement en boucle à travers chaque mois de la gamme et comptez tous les étudiants inscrits à ce mois ou avant ce mois et dont l'inscription n'avait pas terminé avant ce mois.

ci-dessous , Je peuploie un tableau appelé $ INCRollmentbymonth qui tiendra le nombre de numéros d'élèves stockés par [année] [mois] puis il suffit de les soustraire de la capacité de la pièce et stockage dans $ openseates [année] [mois] [mois]

supposer $ résultat est un tableau de lignes renvoyées de la base de données: xxx

Après cette boucle, impression d'impression Les informations souhaitées sont une matière triviale: xxx

désolé, je n'ai pas le temps Pour le tester, il pourrait donc y avoir une faute de frappe ou quelque chose que j'ai négligé, mais j'espère que cela vous indique dans une bonne direction ..!


0 commentaires