{"id":232358,"date":"2009-12-02T09:41:42","date_gmt":"2009-12-02T12:41:42","guid":{"rendered":"http:\/\/www.charles.pilger.com.br\/blog\/?p=232358"},"modified":"2009-12-02T09:43:41","modified_gmt":"2009-12-02T12:43:41","slug":"ordenando-por-campos-compostos-no-mysql","status":"publish","type":"post","link":"http:\/\/www.charles.pilger.com.br\/blog\/archives\/232358","title":{"rendered":"Ordenando por campos compostos no MySQL"},"content":{"rendered":"<p>Hoje me deparei com uma situa\u00e7\u00e3o meio que inusitada: fui obrigado a ordenar uma tabela por c\u00f3digo de produtos.<\/p>\n<p>At\u00e9 a\u00ed tudo normal, se n\u00e3o fossem os c\u00f3digos algo como &#8216;CT 70&#8217;, &#8216;CT 100&#8217;, &#8216;CT 40&#8217;, &#8216;LG 90&#8217;, e por a\u00ed vai. O problema \u00e9 que se eu fa\u00e7o um <strong>SELECT * ORDER BY codigo<\/strong> ele retorna a seq\u00fc\u00eancia anterior assim: &#8216;CT 100&#8217;, &#8216;CT 40&#8217;, &#8216;CT 70&#8217;, &#8216;LG 90&#8242;. Como se pode observar o&#8217; CT 100&#8242; vem antes do &#8216;CT 40&#8217; e &#8216;CT 70&#8217;, j\u00e1 que para o MySQL est\u00e1 fazendo uma ordena\u00e7\u00e3o por string.<\/p>\n<p>Assim sendo, o que fazer? Bem, felizmente o MySQL tem a<a title=\"MySQL string-functions: substring-index\" href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.0\/en\/string-functions.html#function_substring-index\"> fun\u00e7\u00e3o substring-index<\/a>, que permite que a gente quebre uma string usando um delimit. Assim, para ordenar de forma correta temos: <strong>SELECT * ORDER BY SUBSTRING_INDEX(codigo, &#8216; &#8216;, 1) ASC, SUBSTRING_INDEX(codigo, &#8216; &#8216;, -1) +0 ASC<\/strong>. Por que o select \u00e9 duplo? Um para ordenar primeiramente pelos caracteres iniciais (sem ele nosso exemplo ficaria\u00a0  &#8216;CT 40&#8217;, &#8216;CT 70&#8242;,&#8217;LG 90&#8217;, &#8216;CT 100&#8217;) e o segundo para ordenar de forma num\u00e9rica (a convers\u00e3o se d\u00e1 gra\u00e7as ao + 0 acrescentado ap\u00f3s a fun\u00e7\u00e3o). Com isso obtemos a ordem correta: &#8216;CT 40&#8217;, &#8216;CT 70&#8217;, &#8216;CT 100&#8217;, &#8216;LT 90&#8217;.<\/p>\n<p>E obrigado ao <a href=\"http:\/\/phcco.com \">Paulo Cazarotto<\/a> pela ajuda \ud83d\ude42 Nunca que eu ia pensar em somar zero para converter de string para num\u00e9rico&#8230; \ud83d\ude00<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hoje me deparei com uma situa\u00e7\u00e3o meio que inusitada: fui obrigado a ordenar uma tabela por c\u00f3digo de produtos. At\u00e9 a\u00ed tudo normal, se n\u00e3o fossem os c\u00f3digos algo como &#8216;CT 70&#8217;, &#8216;CT 100&#8217;, &#8216;CT 40&#8217;, &#8216;LG 90&#8217;, e por a\u00ed vai. O problema \u00e9 que se eu fa\u00e7o um SELECT * ORDER BY codigo [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"http:\/\/www.charles.pilger.com.br\/blog\/wp-json\/wp\/v2\/posts\/232358"}],"collection":[{"href":"http:\/\/www.charles.pilger.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.charles.pilger.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.charles.pilger.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.charles.pilger.com.br\/blog\/wp-json\/wp\/v2\/comments?post=232358"}],"version-history":[{"count":2,"href":"http:\/\/www.charles.pilger.com.br\/blog\/wp-json\/wp\/v2\/posts\/232358\/revisions"}],"predecessor-version":[{"id":232360,"href":"http:\/\/www.charles.pilger.com.br\/blog\/wp-json\/wp\/v2\/posts\/232358\/revisions\/232360"}],"wp:attachment":[{"href":"http:\/\/www.charles.pilger.com.br\/blog\/wp-json\/wp\/v2\/media?parent=232358"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.charles.pilger.com.br\/blog\/wp-json\/wp\/v2\/categories?post=232358"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.charles.pilger.com.br\/blog\/wp-json\/wp\/v2\/tags?post=232358"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}