Jump to content
Sign in to follow this  
billcom

ORDER BY CASE and date

Rate this topic

Recommended Posts

Bonjour le hub,



Je bloque sur une requête sql pour MYSQL.



J'ai une liste d'evenement avec un id "id_ev" et une date de début type DATE "date_deb_ev". Certains évènements sont déjà passé et d'autre sont à venir.


J'aimerai écrire une requête qui me permet d'afficher l'ensemble des évènements avec pour ordre d'affichage



Dans un premier temps les évènements à venir trié par date_deb_ev ASC et ensuite les évènement passé par date_deb_ev DESC le tout en une seule requête



Pour le moment j'ai ça



SELECT id_ev, date_deb_ev
FROM evenements
ORDER BY CASE WHEN
date_deb_ev >= CURDATE() THEN 0 ELSE 1 end ASC,
id_ev ASC




+-------+-------------+
| id_ev | date_deb_ev |
+-------+-------------+
| 59 | 2014-04-30 |
| 106 | 2014-05-23 |
| 110 | 2014-04-26 |
| 146 | 2014-05-21 |
| 147 | 2014-04-30 |
| 156 | 2014-04-26 |
| 172 | 2014-04-30 |
| 175 | 2014-05-23 |
| 202 | 2014-05-21 |
| 224 | 2014-05-27 |
| 226 | 2014-05-27 |
| 227 | 2014-05-28 |
| 242 | 2014-05-21 |
| 243 | 2014-04-28 |
| 254 | 2014-04-26 |
| 266 | 2014-04-30 |
| 267 | 2014-04-30 |
| 268 | 2014-05-24 |
| 270 | 2014-06-18 |
| 278 | 2014-04-30 |
+-------+-------------+
20 rows in set (0.04 sec)


ça me retourne un resultat mais rien de cohérent avez vous une idée ou une piste pour mener à bien ma requête ?


Share this post


Link to post
Share on other sites

Bonjour ,



Tu ordonnes tes dates en te basant sur ton champ id_ev ,


Base toi sur tes dates , essaye le code suivant :



SELECT id_ev, date_deb_ev
FROM test.evenements
ORDER BY CASE WHEN
date_deb_ev >= CURDATE() THEN 0 ELSE 1 end ASC,
date_deb_ev ASC

Edited by BouleBilll

Share this post


Link to post
Share on other sites

Salut BouleBill,



Merci la solution est bonne smile.gif



Et pour faire un tri des évènements à venir en date_dev_ev ASC et les évènements passé date_deb_ev DESC tu aurai une idée ?


Share this post


Link to post
Share on other sites

Version définitive de la requête :)





SELECT id_ev, date_deb_ev
FROM evenements
ORDER BY CASE WHEN
date_deb_ev >= CURDATE() THEN 0 ELSE 1 end ASC,
ABS(DATEDIFF(date_deb_ev, CURDATE())) ASC

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • By eechoo
      Bonjour à tous,



      Auriez vous une soluc pour afficher un code ou un mot aléatoirement avec du PHP sur mon site ?



      Pourquoi PHP ?



      Car je veux aussi que ce mot soit stocker au même moment dans la BBD ( une table bien précise )



      Concrètement :



      1 - Un internaute clique sur un bouton paypal de mon site



      2 - il est dirigé vers paypal et effectue le paiement



      3- le paiement terminé il est dirigé vers la page de connexion sur mon site. Et c'est la qu'intervient le code aléatoire ( ex : voiçi votre mot de passe et nom d'utilisateur )



      Donc : mon site > paypal > retour sur mon site et login > téléchargement du fichier.



      Ou alors connaissez vous vous un script pret à l'emploi permettant de télécharger un fichier uniquement aprés un paiement, car à part ces étapes je ne vois pas d'autres solutions



      Merci par avance,



      Bonne soirée à tous.

    • By eechoo
      Bonjour à tous,



      Ca faisait longtemps.



      J'ai parcouru le forum et on en parle beaucoup ( des jointures ) mais je m'y perd. étant designer et non pas devellopeur je ne sais pas trop comment joindre 2 tables c'est à dire :



      J'ai installer une mini boutique sur mon site. Ca fonction tres bien sauf que c'est livré sans catégories. C'est à dire qu'on peut juste mettre des produits mais pas des catégories.



      J'ai donc créer une table dans phpmyadmin pour les catégories, juqu'ici tout va bien.



      J'ai donc la table des produits comportant : ID, nom du produit, prix, etc..



      J'ai aussi la table des catégories comportant : ID, nom de la catégorie, description, etc...



      C'est la que je bloque, comment lié ces 2 tables afin d'afficher les produits d'une categorie spécifique.



      Merci à tous

    • By elfaus
      Salut à tous,



      j'essaye d'optimiser un script php afin de n'avoir à réaliser qu'une seule requête et récupérer toutes les informations nécessaires. J'ai découvert il y a peu group_concat mais je ne suis parvenu à le faire fonctionner que sur un seul champ.



      Soit les deux tables sources suivantes :



      Heroes


      +----+-----------+------------+
      | id| name_fr | name_us |
      +----+-----------+------------+
      | 1 | ababab | ababab |
      | 3 | efefef | efefef |
      +----+-----------+------------+
      Schools


      +----+-----------+-----------+
      | id | name_fr | name_us |
      +----+-----------+-----------+
      | 3 | ababab | ababab |
      | 5 | cdcdcd | cdcdcd |
      | 9 | efefef | efefef |
      +----+-----------+-----------+

      Soit la table relationnelle suivante :
      Heroes_Schools


      +----+----+
      | hid|sid |
      +----+----+
      | 1 | 3 |
      | 1 | 5 |
      | 3 | 9 |
      +----+----+



      L'idée, est de faire en sorte de récupérer un résultat similaire à celui-ci


      +----+-----------+-----------+--------------------------------------------------+
      | id| name_fr | name_us | schools |
      +----+-----------+-----------+--------------------------------------------------+
      | 1 | ababab | ababab | 3, ababab, ababab; 5, cdcdcd, cdcdcd |
      | 3 | efefef | efefef | 9, efefef, efefef |
      +----+-----------+-----------+--------------------------------------------------+
      Afin de pouvoir par la suite faire un traitement de tableau en php et passer le contenu de schools en paramètre d'une autre class que celle réalisant la requête et stockant les information id, name_fr et name_us



      Pour l'instant j'ai ça :


      SELECT mch.id, mch.name_fr, mch.name_us, GROUP_CONCAT(mcs.id) AS schools_id, GROUP_CONCAT(mcs.name_fr) AS schools_name_fr, GROUP_CONCAT(mcs.name_us) AS schools_name_us

      FROM mom_cards_heroes AS mch
      LEFT JOIN mom_cards_heroes_schools AS mchs ON mch.id = mchs.heroesid
      LEFT JOIN mom_cards_schools AS mcs ON mchs.schoolid = mcs.id
      WHERE mch.`publish` = 1
      GROUP BY mch.id
      ORDER BY mch.factionid, mch.name_fr ASC

      Mais pas suffisant x)
    • By Torlax
      Bonjour à tous !



      Etant totalement désespéré, je m'adresse à vous en dernier recours



      Je vous retrace l'historique de mon problème :



      Je m'occupe actuellement d'un site avec un nombre de connexion plutot énorme (150 000 à 300 000 visiteurs par jours en moyenne). Le site en question est un bon gros Wordpress (9 plugins actif, plugins plutôt propre parmi les plus connu) avec une base sql pesant 380 Mo et environs 9000 articles, ainsi qu'un forum IPB don la base sql pèse 150 Mo... Auparavant, nous avions un gros HG XXL chez ovh pour gérer le tout. J'avais monté un ESX avec ma VM dessus qui comprenais Apache, php5, Mysql, bref... Après optimisation, on arrivais à grimper à environs 4000/4500 connexions simultanés (via Google Analytics) avec un Load Average assez élevé... J'ai donc fait le choix de partir sur deux serveur MG SSD plus petit (mono Xeon, 64 Go de ram sur les deux), le tout avec un Vrack (Baie Virtuelle), un bloc RIPE, et j'ai connecté mes deux serveur en "privé". Sur le premier (le frontal) J'y ai mis Apache + PHP et sur le seconds, mon Mysql. En gros j'ai réparti la charge sur deux serveur quoi... Après optimisation, j'obtiens à peu prêt la même tolérance à la charge qu'auparavant, mais avec des temps de réponses plutot rapide. Le souci, c'est que pendant les pic d'audience, ça se vautre méchamment...



      Constatations actuelles :



      - Mes logs apache ne me remonte aucunement la fameuse alerte comme quoi j'aurais atteins "Max_connection" (réglé sur 1024 actuellement).

      - Mes logs Mysql ne me remonte aucunement "Too many connections"

      - J'utilise bien un Opcode, ici APC (avec valeur 2Go de cache)

      - Coté Wordpress, W3 Total Cache paramétré

      - Cloudflare actif pour décharger apache de toute la partie "statique"



      En fait, quand ça pète, ça donne réellement l'impression que Apache suit correctement, Mysql sature, il tombe... les requête s'empilent et font ensuite pétés apache + php.



      J'en viens à ma demande... La partie ou je m'y connais le moins bien est Mysql (comme beaucoup...) Et je suspecte beaucoup d'avoir une base non optimisé (manque d'index, problème de jointures etc...) en plus de (peut être) quelques script foireux. Pour les scripts foireux, nous y travaillons : Nous allons faire développer notre propre thème, avec tout ce que nous avons besoin en plugin directement intégré pour décharger Wordpress.



      Là ou je bute, c'est l'optimisation de ma base Mysql... Les index, etc... Je ne sais pas dutout par ou commencer. J'ai également essayé de passé toutes mes table en Innodb pour éviter les lock au niveau des tables, ça s'écroule encore plus vite qu'en Myisam, en ayant pourtant pris soin de ne pas faire de réglages foireux (Pool_Buffer_Size à 50/80% de ma ram, etc...). J'ai également essayé "Apache + Varnish", "Nginx + Varnish", "Apache + Nginx en reverse proxy", malgré tout ça, rien à faire ça fini toujours par explosé quasiment dans les mêmes circonstances.



      Si une bonne âme se sent de me conseiller sur ce que je devrais faire, m'aiguiller ou carrément me proposer un audit, je suis preneur... Enfin, je vous met mes fichiers de config actuel ci-dessous :



      Merci à tous !





      My.ini :


      [mysqld]
      port = 3306
      socket = /var/run/mysqld/mysqld.sock
      bind-address = xxx.xxx.xxx.xxx

      skip-external-locking
      max_connections = 500
      key_buffer_size = 10G
      max_allowed_packet = 1M
      table_open_cache = 4
      sort_buffer_size = 64K
      read_buffer_size = 256K
      read_rnd_buffer_size = 256K
      net_buffer_length = 2K
      thread_stack = 128K
      table_cache = 2048
      query_cache_limit = 30M
      query_cache_size = 128M #(J'attends les 48h de Tuning-primer ici pour augmenter cette valeur)
      thread_cache_size = 20
      max_heap_table_size = 128M #(J'attends les 48h de Tuning-primer ici pour augmenter cette valeur)


      [mysqldump]
      quick
      max_allowed_packet = 16M

      [mysql]
      no-auto-rehash
      # Remove the next comment character if you are not familiar with SQL
      #safe-updates

      [myisamchk]
      key_buffer_size = 8M
      sort_buffer_size = 8M

      [mysqlhotcopy]
      interactive-timeout





      Apache.conf :




      Timeout 300
      KeepAlive On
      MaxKeepAliveRequests 200
      KeepAliveTimeout 2
      HostnameLookups Off

      <IfModule mpm_prefork_module>
      StartServers 64
      MinSpareServers 64
      MaxSpareServers 128
      ServerLimit 1500
      MaxClients 1500
      MaxRequestsPerChild 300
      </IfModule>




      Résultat TuningPrimer (ça ne fait pas 48h là, donc ne veut pas dire grand chose mais j'vous le met quand meme...) :




      MySQL Version 5.5.30-1~dotdeb.0 x86_64

      Uptime = 0 days 12 hrs 50 min 46 sec
      Avg. qps = 124
      Total Questions = 5735385
      Threads Connected = 3

      Warning: Server has not been running for at least 48hrs.
      It may not be safe to use these recommendations

      To find out more information on how each of these
      runtime variables effects performance visit:
      http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html
      Visit http://www.mysql.com/products/enterprise/advisors.html
      for info about MySQL's Enterprise Monitoring and Advisory Service

      SLOW QUERIES
      The slow query log is NOT enabled.
      Current long_query_time = 10.000000 sec.
      You have 0 out of 5735409 that take longer than 10.000000 sec. to complete
      Your long_query_time seems to be fine

      BINARY UPDATE LOG
      The binary update log is NOT enabled.
      You will not be able to do point in time recovery
      See http://dev.mysql.com/doc/refman/5.5/en/point-in-time-recovery.html

      WORKER THREADS
      Current thread_cache_size = 20
      Current threads_cached = 17
      Current threads_per_sec = 0
      Historic threads_per_sec = 0
      Your thread_cache_size is fine

      MAX CONNECTIONS
      Current max_connections = 500
      Current threads_connected = 4
      Historic max_used_connections = 39
      The number of used connections is 7% of the configured maximum.
      You are using less than 10% of your configured max_connections.
      Lowering max_connections could help to avoid an over-allocation of memory
      See "MEMORY USAGE" section to make sure you are not over-allocating

      INNODB STATUS
      Current InnoDB index space = 0 bytes
      Current InnoDB data space = 0 bytes
      Current InnoDB buffer pool free = 98 %
      Current innodb_buffer_pool_size = 128 M
      Depending on how much space your innodb indexes take up it may be safe
      to increase this value to up to 2 / 3 of total system memory

      MEMORY USAGE
      Max Memory Ever Allocated : 10.29 G
      Configured Max Per-thread Buffers : 406 M
      Configured Max Global Buffers : 10.26 G
      Configured Max Memory Limit : 10.66 G
      Physical Memory : 39.38 G
      Max memory limit seem to be within acceptable norms

      KEY BUFFER
      Current MyISAM index space = 88 M
      Current key_buffer_size = 10.00 G
      Key cache miss rate is 1 : 660
      Key buffer free ratio = 80 %
      Your key_buffer_size seems to be fine

      QUERY CACHE
      Query cache is enabled
      Current query_cache_size = 128 M
      Current query_cache_used = 43 M
      Current query_cache_limit = 30 M
      Current Query cache Memory fill ratio = 34.20 %
      Current query_cache_min_res_unit = 4 K
      MySQL won't cache query results that are larger than query_cache_limit in size

      SORT OPERATIONS
      Current sort_buffer_size = 64 K
      Current read_rnd_buffer_size = 256 K
      Sort buffer seems to be fine

      JOINS
      Current join_buffer_size = 132.00 K
      You have had 2 queries where a join could not use an index properly
      You should enable "log-queries-not-using-indexes"
      Then look for non indexed joins in the slow query log.
      If you are unable to optimize your queries you may want to increase your
      join_buffer_size to accommodate larger joins in one pass.

      Note! This script will still suggest raising the join_buffer_size when
      ANY joins not using indexes are found.

      OPEN FILES LIMIT
      Current open_files_limit = 65536 files
      The open_files_limit should typically be set to at least 2x-3x
      that of table_cache if you have heavy MyISAM usage.
      Your open_files_limit value seems to be fine

      TABLE CACHE
      Current table_open_cache = 2048 tables
      Current table_definition_cache = 400 tables
      You have a total of 253 tables
      You have 311 open tables.
      The table_cache value seems to be fine

      TEMP TABLES
      Current max_heap_table_size = 128 M
      Current tmp_table_size = 16 M
      Of 65393 temp tables, 38% were created on disk
      Perhaps you should increase your tmp_table_size and/or max_heap_table_size
      to reduce the number of disk-based temporary tables
      Note! BLOB and TEXT columns are not allow in memory tables.
      If you are using these columns raising these values might not impact your
      ratio of on disk temp tables.

      TABLE SCANS
      Current read_buffer_size = 256 K
      Current table scan ratio = 388 : 1
      read_buffer_size seems to be fine

      TABLE LOCKING
      Current Lock Wait ratio = 1 : 21
      You may benefit from selective use of InnoDB.
      If you have long running SELECT's against MyISAM tables and perform
      frequent updates consider setting 'low_priority_updates=1'
      If you have a high concurrency of inserts on Dynamic row-length tables
      consider setting 'concurrent_insert=ALWAYS'.

×
×
  • Create New...