Je viens vers vous car j'ai un problème de requête SQL, j'aimerais ranger par ordre croissant 2 colonnes d'une même table (DATE_RESERVATION et NAVETTE_RETOUR), sauf que là où ça se complique : la 1ère colonne ne contient que des heures de réservations et l'autre colonne peut posséder des heures de réservations mais des fois des "0", j'aimerais donc avec une seule et même requête si possible, checker si cette colonne "NAVETTE_RETOUR" contient des "0", si non rangé par ordre croissant avec la colonne "DATE_RESERVATION", est-ce que déjà pour commencer on peut faire une sorte de if en SQL ?
Voici ce que j'ai déjà testé :
SELECT * FROM wp_ficheClients
WHERE DATE_RESERVATION <= CURDATE() +1 AND DATE_RESERVATION >= CURDATE()
AND A_PAYE = 1 AND DESCENTE = "EYG -> GV (20 km)" AND STATIONNEMENT = "Le Port"
ORDER BY
CASE
WHEN HEURE_NAVETTE_RETOUR != "0" THEN HEURE_NAVETTE_RETOUR
WHEN HEURE_NAVETTE_RETOUR = "0" THEN DATE_RESERVATION
END ASC
Explication du code :
Donc en gros, je récupère tous les clients d'aujourd'hui qui ont payé et qui font une certaine descente (c'est des kayaks) et dont les gens sont stationnées à un certains endroit sur le parcours.
Merci à vous et merci de ne pas me juger sur la qualité du code, y a toujours plus simple de faire mieux et d'optimiser..
Je l'ai posté là-bas aussi, et en soi il n'y a pas de code PHP mais je réalise un site web en PHP, donc je savais pas forcément où le mettre.
Le "DATE_RESREVATION" est un datetime, tout ce qui a de plus logique et "NAVETTE_RETOUR" est un tinytext.
Donc effectivement quand, il n'y pas de navette retour c'est un "0" et pas 0 (je préfère le préciser) vu que c'est du text, s'il y a une navette alors ça ressemble à par exemple : 15:00 ou 09:30, etc.
- Edité par Guillaumedu15 15 février 2021 à 21:37:12
On ne poste jamais une même question à plusieurs endroits (au besoin, c'est déplacé), tu vas te faire tirer les oreilles ...
> quand, il n'y pas de navette retour c'est un "0"
Pourquoi pas NULL ? Et un type TIME plutôt que TINYTEXT ? Voire même un DATETIME aussi même si ça paraît inutile car ça reprend la même date, au moins ça aurait permis de faire un IFNULL de DATETIME.
Bref, un ORDER va avoir du mal à trier deux types de données totalement différents (des "heures" et des datetimes) en même temps, ça ne va sûrement pas donner ce que tu penses. Il faut séparer les deux (si approprié) ou alors trouver le moyen de construire un DATETIME intégrant l'"heure" (quitte à ce qu'ils soient "bidons" quand ça vaut "0") pour que ça trie comme tu le veux.
Alors je suis obligé de garder le "0", car il pourra être mis par des utilisateurs, et ce même champs comme je l'ai dit précédemment pourra obtenir des heures comme DATE_RESERVATION, vu que NAVETTE_RETOUR = "0", si la personne est garé en bas de la descente ou bien NAVETTE_RETOUR = "18:00" s'il s'est garé en haut de la descente. 😉
> Tu veux quel genre de résultat ?
Du coup, voici pour l'instant ce que j'ai, ça fonctionne comme je veux mais comme ma requête sélectionne tous les clients et qu'ensuite après je fais un traitement par php, tu te doutes que dans quelques cas si un client est garé en haut de la descente - il a donc une navette retour à la fin - et qu'il commence (DATE_RESERVATION) = 09:00 et que NAVETTE_RETOUR = "15:00" ça ne sera pas trié correctement dans mon tableau final car j'ai mis des conditions partout mais elles sont séparées. Tu as un exemple concret dans mon tableau d'ailleurs, ligne 2, tu vois le 14:00 après le 16:00, alors qu'elle devrait être dans la 1ère ligne. Donc, c'est pour cela que j'aimerai que ça soit trié directement avec une requête SQL qu'en PHP, c'est trop bordélique 🤔
Ici ma page des navettes :
Donc tu vois il y a 2 tableaux puisque sur le parcours il y a 3 stationnement, au début, au milieu et à la fin, et du coup, comme tu l'auras sûrement compris c'est parce qu'il y a un stationnement au milieu que ça met le bazar (en plus le mec peut se stationner au milieu du parcours prendre une navette allé et une navette retour - oui il y a des gens comme ça ... , sinon ça fonctionnait tranquille .
Je te joins aussi le comment c'est mis dans ma BDD, j'ai fait la même requête pour éviter que tu te perdes 😉 :
Donc comme tu peux le voir les "0" ne doivent pas s'afficher mais ça je le fais déjà dans mon traitement PHP, c'est pour cela que je voulais tester en SQL si la colonne NAVETTE_RETOUR = "0" alors on fais rien, sinon on récupère la valeur de NAVETTE_RETOUR pour justement la triés et la mettre dans mon tableau.
Ouf c'est long à écrire, j'espère que tu comprends ce que je veux faire 😅, sinon tant pis je suis dispo pour te répondre 😁.
Merci en tout cas.
[EDIT 1] : Sur le phpmyadmin, là où il y a la flèche rouge c'est la ligne qui pose problème, comme tu peux le voir le mec est garé au milieu et il fait une petite descente EYG -> LP
Ouais et j'ai oublié de mentionner même si c'est pas très important les parcours de kayak font :
EYG -> LP -> GV
[EDIT 2] : Je te mets un autre exemple, comme je t'ai dit le mec se gare au milieu du parcours mais fait la grande descente donc EYG -> GV et du coup il ne l'affiche pas 😥, je te joins mon tableau et le phpmyadmin :
Mon tableau :
Et le phpmyadmin :
- Edité par Guillaumedu15 16 février 2021 à 1:02:36
Désolé mais je crois que j'ai pas tout compris de ce que tu voulais me dire 🤔, car là il y a des "0" partout ou des heures.
Et, je n'ai aucune erreur PHP.
[EDIT 1] : En fait, si NAVETTE_RETOUR = "0" on récupère DATE_RESERVATION, sinon on prends la valeur de NAVETTE_RETOUR et on trie le résultat par ordre croissant.
- Edité par Guillaumedu15 16 février 2021 à 11:42:44
Oui il ne vaut pas "0", car il fait une grande descente mais il est garé au milieu (LP) du parcours, ce qu'il signifie qu'il doit prendre une navette pour aller à EYG, il fait sa descente EYG -> GV et arrivé à GV il doit reprendre une navette pour aller à LP.
[EDIT 1] : Donc en gros, dans mon tableau HTML il sera remonté 2 fois, puisqu'il prend 2 navettes différentes, l'une pour l'aller et l'autre pour le retour. Donc dans le 1er tableau je vais récupérer DATE_RESERVATION et dans l'autre l'heure de NAVETTE_RETOUR.
Mon code est correct, c'est juste que je n'arrive pas à remonter ou plutôt à trier avec une seule et même requête le résultat final.
[EDIT 2] : Voici le tableau qui remonte bien l'affiche de Pierre, (j'avais eu un petit soucis de mon côté, mais là tout va bien) et comme tu peux le voir les heures ne sont pas triés correctement :
- Edité par Guillaumedu15 16 février 2021 à 12:33:34
Ok, je vais la refaire et tu sais quoi, on va se préoccuper d'un seul tableau sur les 2 que j'affiche sur ma page, ça sera plus simple.
Je cherche à récupérer en 1 seule requête un résultat selon différentes descentes et différents stationnement sur le parcours (début, milieu et fin, respectivement EYG, LP, GV).
Pour ce faire, j'utilise actuellement ce snippet :
$navette_aujourdhui__LP_EYG = $bdd->prepare('SELECT * FROM wp_ficheClients
WHERE DATE_RESERVATION
BETWEEN "2021-02-08 00:00:00" AND "2021-02-08 23:59:59" AND A_PAYE = 1
ORDER BY DATE_RESERVATION ASC');
$navette_aujourdhui__LP_EYG->execute();
Ensuite, j'ai mon while qui récupère les différentes colonnes du SELECT.
Je check si NAVETTE_RETOUR != "0" et ensuite je check si :
- La descente est EYG -> GV où la personne est garée à EYG => navette pour retour au début
- La descente est EYG -> GV où la personne est garée à LP => navette pour retour au milieu
- La descente est EYG -> LP où la personne est garée à EYG => navette pour retour au début
Ensuite, je check si NAVETTE_RETOUR == "0" et ensuite je check si :
- La descente est EYG -> LP où la personne est garée à LP => navette pour commencer la descente
- La descente est EYG -> GV où la personne est garée à GV => pareil
Comme je l'ai dit précédemment :
NAVETTE_RETOUR == "0" => il n'y a pas de navette, donc le client est garé en bas de la descente.
NAVETTE_RETOUR != "0" => un horaire est défini, le client peut être garé soit au milieu soit au début d'une descente.
Voici mon code avec les "if" et "elseif" pour la génération à la volée du tableau :
<!-- 1er tableau -->
<div style="overflow-x:auto; width:49%" class="tableaux">
<table id="myTable">
<thead>
<tr>
<td colspan="11"><center>NAVETTE LE PORT -> ENTRAYGUES</center></td>
<tr>
<th scope="col"><center>Horaires</center></th>
<th scope="col"><center>Nom</center></th>
<th scope="col"><center>Prénom</center></th>
<th scope="col"><center>Personnes</center></th>
<th scope="col"><center>KO</center></th>
<th scope="col"><center>C2</center></th>
<th scope="col"><center>C3</center></th>
<th scope="col"><center>C4</center></th>
<th scope="col"><center>KF</center></th>
<th scope="col"><center>RAFT</center></th>
<th scope="col"><center>PADDLE</center></th>
</tr>
</thead>
<tbody id="myBody">
<?php
//on affiche les datas de chaque client d'aujourd'huisauf ceux qui se font la desc
while ($navette__LP_EYG = $navette_aujourdhui__LP_EYG->fetch(PDO::FETCH_ASSOC))
{
//on check si l'heure la navette retour est différent de 0 ou NULL et qu'il se gare au début de sa descente, on prend en compte l'heure de la navette retour
if($navette__LP_EYG["HEURE_NAVETTE_RETOUR"] != "0" && $navette__LP_EYG["DESCENTE"] == "EYG -> GV (20 km)" && $navette__LP_EYG["STATIONNEMENT"] == "Entraygues")
{
?>
<tr>
<!-- HEURE CLIENT -->
<td><?= date("H:i", strtotime("+30 minutes", strtotime($navette__LP_EYG["HEURE_NAVETTE_RETOUR"]))); ?></td>
<!--NOM -->
<td><?= $navette__LP_EYG["NOM"] ?></td>
<!--PRENOM -->
<td><?= $navette__LP_EYG["PRENOM"] ?></td>
<!--TOTAL DE PERSONNE (adultes + enfants)-->
<td><?= $navette__LP_EYG["NOMBRE_TOTAL_PERSONNES"] ?></td>
<!--TYPE DE BATEAUX -->
<td><?= $navette__LP_EYG["KO"] ?></td>
<td><?= $navette__LP_EYG["C2"] ?></td>
<td><?= $navette__LP_EYG["C3"] ?></td>
<td><?= $navette__LP_EYG["C4"] ?></td>
<td><?= $navette__LP_EYG["KF"] ?></td>
<td><?= $navette__LP_EYG["RAFT"] ?></td>
<td><?= $navette__LP_EYG["PADDLE"] ?></td>
</tr>
<?php
}
//on check si l'heure de la navette retour est différente de 0 et qu'il se gare au milieu de la Grande descente,
//on prend en compte l'heure de départ de la réservation dans fiche client et (l'heure de fin de réservation [ modifiée dans le suivi client ] dans le 2nd tableau)
elseif($navette__LP_EYG["HEURE_NAVETTE_RETOUR"] != "0" && $navette__LP_EYG["DESCENTE"] == "EYG -> GV (20 km)" && $navette__LP_EYG["STATIONNEMENT"] == "Le Port")
{
//on ajoute pas 30 min au client dans ce cas là, on récupère juste l'heure de réservation de la fiche client
?>
<tr>
<!-- HEURE CLIENT -->
<td><?= date("H:i", strtotime($navette__LP_EYG["DATE_RESERVATION"])); ?></td>
<!--NOM -->
<td><?= $navette__LP_EYG["NOM"] ?></td>
<!--PRENOM -->
<td><?= $navette__LP_EYG["PRENOM"] ?></td>
<!--TOTAL DE PERSONNE (adultes + enfants)-->
<td><?= $navette__LP_EYG["NOMBRE_TOTAL_PERSONNES"] ?></td>
<!--TYPE DE BATEAUX -->
<td><?= $navette__LP_EYG["KO"] ?></td>
<td><?= $navette__LP_EYG["C2"] ?></td>
<td><?= $navette__LP_EYG["C3"] ?></td>
<td><?= $navette__LP_EYG["C4"] ?></td>
<td><?= $navette__LP_EYG["KF"] ?></td>
<td><?= $navette__LP_EYG["RAFT"] ?></td>
<td><?= $navette__LP_EYG["PADDLE"] ?></td>
</tr>
<?php
}
//on check si l'heure la navette retour est différente de 0 et qu'il se gare à la fin de sa descente, on prend en compte l'heure de la réservation
elseif($navette__LP_EYG["HEURE_NAVETTE_RETOUR"] == "0" && $navette__LP_EYG["DESCENTE"] == "EYG -> GV (20 km)" && $navette__LP_EYG["STATIONNEMENT"] == "Grand-Vabre")
{
?>
<tr>
<!-- HEURE CLIENT -->
<td><?= date("H:i", strtotime("+30 minutes", strtotime($navette__LP_EYG["DATE_RESERVATION"]))); ?></td>
<!--NOM -->
<td><?= $navette__LP_EYG["NOM"] ?></td>
<!--PRENOM -->
<td><?= $navette__LP_EYG["PRENOM"] ?></td>
<!--TOTAL DE PERSONNE (adultes + enfants)-->
<td><?= $navette__LP_EYG["NOMBRE_TOTAL_PERSONNES"] ?></td>
<!--TYPE DE BATEAUX -->
<td><?= $navette__LP_EYG["KO"] ?></td>
<td><?= $navette__LP_EYG["C2"] ?></td>
<td><?= $navette__LP_EYG["C3"] ?></td>
<td><?= $navette__LP_EYG["C4"] ?></td>
<td><?= $navette__LP_EYG["KF"] ?></td>
<td><?= $navette__LP_EYG["RAFT"] ?></td>
<td><?= $navette__LP_EYG["PADDLE"] ?></td>
</tr>
<?php
}
//on check si l'heure la navette retour est différente de 0 et qu'il se gare à la fin de sa descente, on prend en compte l'heure de la réservation
elseif($navette__LP_EYG["HEURE_NAVETTE_RETOUR"] != "0" && $navette__LP_EYG["DESCENTE"] == "EYG -> LP (10 km)" && $navette__LP_EYG["STATIONNEMENT"] == "Entraygues")
{
?>
<tr>
<!-- HEURE CLIENT -->
<td><?= date("H:i", strtotime($navette__LP_EYG["HEURE_NAVETTE_RETOUR"])); ?></td>
<!--NOM -->
<td><?= $navette__LP_EYG["NOM"] ?></td>
<!--PRENOM -->
<td><?= $navette__LP_EYG["PRENOM"] ?></td>
<!--TOTAL DE PERSONNE (adultes + enfants)-->
<td><?= $navette__LP_EYG["NOMBRE_TOTAL_PERSONNES"] ?></td>
<!--TYPE DE BATEAUX -->
<td><?= $navette__LP_EYG["KO"] ?></td>
<td><?= $navette__LP_EYG["C2"] ?></td>
<td><?= $navette__LP_EYG["C3"] ?></td>
<td><?= $navette__LP_EYG["C4"] ?></td>
<td><?= $navette__LP_EYG["KF"] ?></td>
<td><?= $navette__LP_EYG["RAFT"] ?></td>
<td><?= $navette__LP_EYG["PADDLE"] ?></td>
</tr>
<?php
}
//on check si l'heure la navette retour est différente de 0 et qu'il se gare à la fin de sa descente, on prend en compte l'heure de la réservation
elseif($navette__LP_EYG["HEURE_NAVETTE_RETOUR"] == "0" && $navette__LP_EYG["DESCENTE"] == "EYG -> LP (10 km)" && $navette__LP_EYG["STATIONNEMENT"] == "Le Port")
{
?>
<tr>
<!-- HEURE CLIENT -->
<td><?= date("H:i", strtotime($navette__LP_EYG["DATE_RESERVATION"])); ?></td>
<!--NOM -->
<td><?= $navette__LP_EYG["NOM"] ?></td>
<!--PRENOM -->
<td><?= $navette__LP_EYG["PRENOM"] ?></td>
<!--TOTAL DE PERSONNE (adultes + enfants)-->
<td><?= $navette__LP_EYG["NOMBRE_TOTAL_PERSONNES"] ?></td>
<!--TYPE DE BATEAUX -->
<td><?= $navette__LP_EYG["KO"] ?></td>
<td><?= $navette__LP_EYG["C2"] ?></td>
<td><?= $navette__LP_EYG["C3"] ?></td>
<td><?= $navette__LP_EYG["C4"] ?></td>
<td><?= $navette__LP_EYG["KF"] ?></td>
<td><?= $navette__LP_EYG["RAFT"] ?></td>
<td><?= $navette__LP_EYG["PADDLE"] ?></td>
</tr>
<?php
}
}
?>
</tbody>
</table>
</div>
Donc, en définitive, voici mon phpmyadmin :
Et, voici le tableau généré à la volée par mon code :
Donc, ici comme tu peux le voir l'heure n'est pas trié par ordre croissante, puisque le "9:00" devrait être en 1ère ligne.
Pour résumer, sur le phpmyadmin, là où j'ai mis une flèche, cette ligne n'est pas au bon endroit dans mon tableau, vu qu'elle n'est pas triée avec les autres horaires.
Je sais pas si c'est plus claire ? Difficile de faire mieux je pense. :/ Sinon un partage d'écran sur discord et go
- Edité par Guillaumedu15 16 février 2021 à 20:05:01
Il faudrait que tu fasses tes calculs d'horaire directement en SQL si tu veux pouvoir trier dessus.
Genre :
$navette_aujourdhui__LP_EYG = $bdd->prepare(<<<'EOS'
SELECT CASE
WHEN HEURE_NAVETTE_RETOUR <> '0' AND DESCENTE = 'EYG -> GV (20 km)' AND STATIONNEMENT = 'Entraygues'
THEN CAST(HEURE_NAVETTE_RETOUR AS TIME) + INTERVAL 30 MINUTE
WHEN HEURE_NAVETTE_RETOUR = '0' AND DESCENTE = 'EYG -> GV (20 km)' AND STATIONNEMENT = 'Grand-Vabre'
THEN TIME(DATE_RESERVATION) + INTERVAL 30 MINUTE WHEN HEURE_NAVETTE_RETOUR <> '0' AND DESCENTE = 'EYG -> GV (20 km)' AND STATIONNEMENT = 'Le Port' THEN TIME(DATE_RESERVATION)
WHEN HEURE_NAVETTE_RETOUR <> '0' AND DESCENTE = 'EYG -> LP (10 km)' AND STATIONNEMENT = 'Entraygues'
THEN CAST(HEURE_NAVETTE_RETOUR AS TIME)
WHEN HEURE_NAVETTE_RETOUR = '0' AND DESCENTE = 'EYG -> LP (10 km)' AND STATIONNEMENT = 'Le Port'
THEN TIME(DATE_RESERVATION)
END AS horaire, fc.*
FROM wp_ficheClients fc
WHERE DATE_RESERVATION BETWEEN '2021-02-08 00:00:00' AND '2021-02-08 23:59:59' AND A_PAYE = 1
ORDER BY horaire
EOS
);
Je ne sais pas si c'est la solution que tu attendais mais pour moi c'est la seule solution (si j'ai compris cette fois) pour vraiment avoir un résultat trié comme tu le souhaites (à moins de réaliser l'équivalent par u(a)sort côté PHP après un fetchAll mais ce serait bien moins efficace). Le fait de le faire en partie SELECT te fait économiser les calculs en PHP pouvant réutiliser le résultat du CASE aliasé en horaire plutôt que de le faire directement de manière "jetable" en ORDER BY (surtout si c'est pour refaire la même chose en PHP ensuite).
Faudrait que je commence par tester cette requête SQL, sauf que j'ai une erreur, il connait pas "fc.*", c'est quoi pour toi "fc.*" ? Par contre, dans ta requête, ça va me sélectionner toutes les colonnes ? Car je vois pas le "*" (astérisque) 🤔.
Et oui, je pense que le calcul dans la requête serait plus facile et plus optimiser, merci pour ce conseil. 🙂
Et c'est quoi "<<<'EOS'", j'ai jamais vu ça 🤨.
Merci
- Edité par Guillaumedu15 17 février 2021 à 1:32:54
Merci beaucoup à toi Julp 😁, je n'aurais jamais trouvé tout seul sans y passer des jours et des jours. Ca correspond parfaitement à ce que je voulais, voici le résultat pour ceux qui chercherait à faire quelque chose de similaire :
Cependant je n'ai pas compris pourquoi tu utilises le Nowdoc ? On en a pas besoin ici. 🤔 Pourrais-tu m'expliquer ?
Perso, je ne l'ai pas mis dans ma requête vu que j'utilise simplemnt du SQL en "dur" sans passer des variables ou quoi que ce soit d'autres.
Merci d'avance !
- Edité par Guillaumedu15 17 février 2021 à 14:32:50
Je n'aurais jamais pu l'écrire sans le code PHP xD
> Cependant je n'ai pas compris pourquoi tu utilises le Nowdoc ? On en a pas besoin ici. 🤔 Pourrais-tu m'expliquer ?
C'est une syntaxe alternative pour écrire une chaîne de caractères en PHP, ce n'est pas une obligation. J'aime à l'utiliser sur les requêtes préparées parce que :
ça "évite" de mettre des variables dans la requête (vu que la syntaxe nowdoc agit comme les ', les variables ne sont pas substituées/restent littérales)
s'il y a des quotes dans la requête, ça évite d'avoir à échapper dans tous les sens
(le tout est plus lisible)
Après, c'est toi qui voit, avec des ' ou des ", ça marchera et est tout autant valable.
Ca marche la prochaine fois je te mets le code directement dans mon 1er post 😂😝.
Merci pour ton explication claire et précise 😉. J'utilise toujours des simples quotes pour englober ma requête, et du coup, si y a des strings dans ma requête alors j'utilise des doubles quotes pour les strings.
- Edité par Guillaumedu15 17 février 2021 à 15:46:18
[SQL] Faire un if sur ce que contient 2 colonnes
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli