Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Bruno Augusto

Estrutura de Referência...

Recommended Posts

Pessoal, alguém teria uma lista de valores que mostre bem claramente os efeitos de um ORDER BY múltiplo?

 

Por exemplo:

 

SELECT * FROM `users` ORDER BY name asc, city desc

Que, até onde eu entendo deveria retornar a lista de usuários ordenada em ordem ascendente pelo nome ao mesmo tempo que descendente pela sua cidade.

 

Isso se deu porque o Andrey postou um Desafio em PHP que a princípio eu achei que seria mais complicado pra mim dado o não tão constante contato com banco de dados.

 

Antes de ele dizer que não precisaria implementar a lógica do Desafio nas queries em si, eu já fui me adiantando criando uma tabela e alguns possíveis valores (alguns programadores do Fórum) mas não consegui enxergar o efeito de múltipla ordenação.

 

Mas não estou bem certo se é isso memso.

 

Se vale, foi essa estrutura simples que montei:

 

 

-- MySQL dump 10.13  Distrib 5.5.16, for Win32 (x86)
--
-- Host: localhost    Database: imasters
-- ------------------------------------------------------
-- Server version	5.5.16

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `fifthchallenge`
--

DROP TABLE IF EXISTS `fifthchallenge`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `fifthchallenge` (
 `pid` int(5) NOT NULL AUTO_INCREMENT,
 `name` varchar(128) NOT NULL,
 `lastName` varchar(128) DEFAULT NULL,
 `city` varchar(128) NOT NULL,
 PRIMARY KEY (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf16;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `fifthchallenge`
--

LOCK TABLES `fifthchallenge` WRITE;
/*!40000 ALTER TABLE `fifthchallenge` DISABLE KEYS */;
INSERT INTO `fifthchallenge` VALUES (1,'Bruno','Augusto','Itajubá'),(2,'Henrique','Barcelos','São Carlos'),(4,'Motta',NULL,'Niterói'),(5,'Prog',NULL,'Rio de Janeiro'),(6,'quintelab',NULL,'Localhost'),(7,'Andrey','Knupp','Minas Gerais'),(8,'Carlos','Coelho','Gravataí'),(9,'Matias','Rezende','São José'),(10,'William','Bruno','São Paulo'),(11,'Mário','Monteiro','Belém'),(12,'João','Batista Neto','Franca');
/*!40000 ALTER TABLE `fifthchallenge` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2012-09-09 12:10:23

 

Daí eu rodei uma query similar à essa citada e obviamente não produziu muita coisa perceptível.

 

Então adicionei um registro falso a mais: Mário Mário vivendo em Mushroom Kingdom ( :lol: )

 

Como agora o nome conflita com um dos outros registros (Mário Monteiro) pude ver com maior clareza que o Mário Mário foi listado antes, devido à sua cidade começar com 'M' ao passo que a do outro começa com 'B'.

 

É isso mesmo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bruno,

 

Seu raciocínio está correto.

Veja o exemplo abaixo, o ORDER BY com múltiplos parâmetros realiza a ordenação no primeiro parâmetro `especies`, depois, realiza a ordenação pelo segundo parâmetro para cada conjunto de valores iguais (por padrão, é case insensitive) do primeiro parâmetro.

 

mysql> SELECT name, species, birth FROM pet
   -> ORDER BY species, birth DESC;
+----------+---------+------------+
| name     | species | birth      |
+----------+---------+------------+
| Chirpy   | bird    | 1998-09-11 |
| Whistler | Bird    | 1997-12-09 |
| Claws    | Cat     | 1994-03-17 |
| Fluffy   | cat     | 1993-02-04 |
| Fang     | dog     | 1990-08-27 |
| Bowser   | Dog     | 1989-08-31 |
| Buffy    | dog     | 1989-05-13 |
| Puffball | hamster | 1999-03-30 |
| Slim     | snake   | 1996-04-29 |
+----------+---------+------------+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Perfeito.

 

Mas você mencionou ser case insensitive e isso me suscitou outra questão, nada a ver com o tópico... A deinifição de sensibilidade ´[e feita através de alguma cláusula da/na QUERY ou através do collation do banco de dados (cs ou ci)?

Compartilhar este post


Link para o post
Compartilhar em outros sites

A deinifição de sensibilidade ´[e feita através de alguma cláusula da/na QUERY ou através do collation do banco de dados (cs ou ci)?

Ótima observação.

 

Respondendo a sua pergunta, acredito que a definição de sensibilidade pode ser feita dos dois jeitos: tanto através de uma clausula na QUERY e também através de collation.

 

Se seu banco for Case Insensitive (por exemplo, collation = latin1_general_ci), quando você quiser que um campo numa operação seja tratado sensitivamente, basta colocar BINARY antes do campo.

 

Assim, para nossa consulta de exemplo levar em consideração Maiúsculas e minúsculas:

 

mysql> SELECT name, species, birth FROM pet
   -> ORDER BY BINARY species, birth DESC;

 

Então, seria melhor eu corrigir o que eu disse no post anterior para:

 

Veja o exemplo abaixo, o ORDER BY com múltiplos parâmetros realiza a ordenação no primeiro parâmetro `especies`, depois, realiza a ordenação pelo segundo parâmetro para cada conjunto de valores iguais do primeiro parâmetro. (Por padrão, se o campo está configurado com collation case insensitive, a comparação também ignora caracteres minúsculos ou maiúsculos, exceto quanto incluído a palavra BINARY)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.