Oferta Nacional - 234x60

Arquivo

Arquivo da Categoria ‘mysql’

How to use string as array in MySQL and work with

In this post I will show you how to use a string array in mysql.

Mysql does not have the type Array in its procedural language. The technique developed here allows you to use the mysql array through a function, and this function can also return a string as Array.

The idea is simple: you must have a separator in the string, which is responsible for separating the data. Thus, the function will act similar to php function explode (), but it will never return an Array type. However, you can work with data inside the function, including being able to call other procedures or functions within the same. You can store data array and sql it, and work with.

Vamos ao código/The Code:


delimiter |

create function str_in_array( split_index varchar(10), arr_str varchar(200), compares varchar(20) )
  returns boolean
  begin
  declare resp boolean default 0;
  declare arr_data varchar(20);

  -- While the string is not empty
  while( length( arr_str ) > 0  ) do

  -- if the split index is in the string
  if( locate( split_index, arr_str ) ) then

      -- get the last data in the string
    set arr_data = ( select substring_index(arr_str, split_index, -1) );

    -- remove the last data in the string
    set arr_str = ( select
      replace(arr_str,
        concat(split_index,
          substring_index(arr_str, split_index, -1)
        )
      ,'')
    );
  --  if the split index is not in the string
  else
    -- get the unique data in the string
    set arr_data = arr_str;
    -- empties the string
    set arr_str = '';
  end if;

  /* HERE YOU DO SOMETHING WITH THE DATA */

  -- in this trivial example, it returns if a string is in the array
  if arr_data = compares then
    set resp = 1;
  end if;

  /* END OF YOUR CODE */
 end while;

return resp;
end
|

delimiter ;

Another example
In this example, we will use a string as array, that will pass some dates, and the function will compare with another date, and checks if there is one date in the array greate than one given.


delimiter |
create function incrementarDado( split_index varchar(10), small_date DATETIME, arr_dates varchar(200) )
  returns boolean
 begin
  declare resp boolean default 0;
  declare current datetime;

  -- while the array is not empty and it dont find a biggest date in the array
  while( length( arr_dates ) > 0 and resp = 0 ) do

    -- if it finds the split_index in the string arr_dates
    if( locate( split_index, arr_dates ) ) then

      -- Set the current date with the value of the last element in the array
      set current = ( select substring_index(arr_dates, split_index, -1) );

      -- removes the last value
      set arr_dates = ( select
                    replace(arr_dates,
                      concat(split_index,
                        substring_index(arr_dates, split_index, -1)
                      )
                    ,'')
                );
    else
      -- if it dont locate de split index

      -- set the current as the unique value in the array
      set current = arr_dates;

      -- empties the array
      set arr_dates = '';
    end if;

    -- Checks if current date is biggest then small_date
    set resp = ( select if( cast( current as DATETIME ) > small_date, 1, 0 ) );

  end while;

    -- returns if it found a date in the array biggest then small_date
   return resp;
end
|

delimiter ;

You can call the function in this way:

select incrementarDado( '|', now(), '2012-02-04|2011-10-08|2013-12-11' );

It’s very usefull!

Here is another posts that have people seeking this functional procedure:

http://www.easywayserver.com/forum/viewtopic.php?t=8
http://forums.devarticles.com/mysql-development-50/arrays-in-mysql-85353.html
http://stackoverflow.com/questions/4650238/split-a-mysql-string-from-group-concat-into-an-array-like-expression-list
http://stackoverflow.com/questions/3405724/how-to-store-data-in-array-in-mysql-function-or-procedure

Posts Relacionados:

  • Nenhum

Como criar string alfanumérica aleatória no MySQL

Para criar uma string alfanumérica aleatória no MySQL basta usar

select left(upper( convert( md5( rand() ) using utf8 )),8);

Isso gera uma string aleatória de 8 caracteres, alfanumérica, em upper case (todas as letras em maiúsculo).

Para retirar a opção de maiúsculo, basta retirar a função upper(); e no casso de quere tudo em minúsculo, basta substituí-la pela função lower().

Para aumentar ou diminuir a quantidade de caracteres, basta alterar o número 8 na consulta para o número desejado, lembrando que por se tratar de um hash md5, a string é limitada a 32 caracteres.

Caso você queira usar um sufixo ou um prefixo, basta usar a função concat(), dessa forma:

-- Prefixo
select concat('MG1',left(upper( convert( md5( rand() ) using utf8 )),5));

-- Sufixo
concat(left(upper( convert( md5( rand() ) using utf8 )),5)),'MG1');

Para acrescentar várias linhas com códigos aleatórios, você pode criar uma função que faça isso, usando um for ou while (veja como criar funções no MySQL aqui).

Posts Relacionados:

  • Nenhum

Como adicionar um heatmap grátis no seu site

10, fevereiro, 2012 Sem comentários

Se o seu site usa php, rodando em servidor apache no linux, com banco de dados MySQL, você poderá ter um HeatMap Gratuito no seu site.

Baixe o ClickHeat, do Labs Media (http://www.labsmedia.com/clickheat/index.html)

Instale baixe o zip e extraia diretamente no diretório raiz (exemplo: /var/www/seusite/public_html). Ele já possui a pasta clickheat.

Acesse http://www.seusite.com/clickheat/index.php. Este é o arquivo de configuração.

Se der erro de permissão de escrita, altere as permissões da pasta clickheat.

No meu caso, deu problema da bliblioteca GD, que não está instalada (imagecreatetruecolor() não disponível, não posso criar imagens (com boa qualidade), cheque se o GD está instalado).

Então vamos instalar.

$ sudo apt-get install php5-gd

$ sudo invoke-rc.d apache2 restart

Para mais detalhes, acesse http://blog.idealmind.com.br/php/como-instalar-extensoes-no-php/

Agora, verifique se todas as dependências estão ok, e avance. Na próxima tela, você terá a configuração. eu deixei tudo como padrão, e somente inseri dados de admin, para cadastrar um usuário e uma senha.

Você deverá inserir um código javascript em cada página a ser trackeada. O script é no formado


<script type="text/javascript" src="http://mi.local/clickheat/js/clickheat.js"></script><a href="http://www.labsmedia.com/clickheat/index.html" title="ClickHeat: clicks heatmap"><img src="http://mi.local/clickheat/images/logo.png" width="80" height="15" border="0" alt="ClickHeat : track clicks" /></a><script type="text/javascript"><!--
clickHeatSite = 'Planos.e.Pre.os';clickHeatGroup = 'pagamento';clickHeatServer = 'http://mi.local/clickheat/click.php';initClickHeat(); //-->
</script>

E agora você terá um heatmap de cada página que você inserir o código Javascript. Enjoy!

Posts Relacionados:

Como conectar ao MySQL usando Python

Neste post vou mostrar como conectar a uma base de dados MySQL através do Python.

Eu tive essa necessidade quando precisei de converter 3 arquivos de texto diferentes, padronizá-los e cadastrar o resultado no banco de dados, afim de compará-los com outros dados no banco de dados.

Para fazer a conexão ao banco de dados é muito simples:


import MySQLdb

db = MySQLdb.connect('localhost','root','')
cursor = db.cursor()

cursor.execute('INSERT INTO tabela VALUES xxxx')

db.close()

Para consultar e trazer os valores, você pode utilizar assim:


import MySQLdb

db = MySQLdb.connect('localhost','root','')
cursor = db.cursor()

cursor.execute('SELECT * from tabela')

rs = cursor.fetchone() # traz uma linha
rs = cursor.fetchall() # traz todas as linhas
rs = cursor.dictfetchall() # traz todas as linhas e cada coluna com seu respectivo nome
print(rs[0]) # imprime o valor do campo 0 da linha correspondente

db.close()

Se você precisar instalar o módulo MySQL para Python, use

# apt-get install python-mysqldb

Até o próximo!

Posts Relacionados:

Como instalar facilmente o LAMP (apache, mysql e php) no ubuntu com tasksel

Olá!

Existe uma maneira muito simples de se instalar o LAMP no Ubuntu, ou seja, Apache 2.2, MySQL 5.1, PHP 5.2 sobre Linux.

Você irá instalar o Tasksel, que é uma ferramenta para instalação fácil de pacotes que dependem de outros, numa maneira coordenada. Ele mesmo se encarrega de instalar cada pacote em sua ordem pré-definida.

Se você quiser saber mais sobre o Tasksel, veja a https://help.ubuntu.com/community/Tasksel.

Para instalar, rode o comando:

$ sudo aptitude install tasksel (ou sudo apt-get install tasksel – Você sabe a diferença entre aptitude e apt-get? clique aqui)

$ sudo tasksel

Tasksel - escolhendo o pacote

Escolha a opção LAMP server, usando as setas e a barra de espaços para selecionar. Dê Tab e quando <ok> estiver vermelho, dê Enter.

Vá seguindo as instruções:

Vai pedir a senha do usuário root do MySQL:

Confirme a senha:

O tasksel continuará a instalação

No final, o Tasksel fecha automaticamente, e o LAMP já estará instalado.

Acesse http://localhost e você verá a mensagem ‘It works!’ do Apache.

;)

Posts Relacionados:

Como calcular idade direto no mysql

Para calcular a idade usando o próprio mysql, é muito simples:

Quero calcular a minha idade (nasci em 1983-09-16):

select year(curdate()) – year(’1983-09-16′) – ( right(curdate(),5) < right(’1983-09-16′,5) ) as idade;

isso me retorna
———
| idade |
———
| 27 |e
———

A lógica é simples:

year(curdate()) – year(’1983-09-16′) vai me retornar a diferença em anos entre hoje (curdate()) e a data do meu aniversário/nascimento (1983-09-16). Hoje, dia 2011-02-08, isso me retorna 28. Só que eu não tenho 28 anos. Ainda tenho 27.

Então pergunto se hoje, tomando como referência o mês e o dia, é menor que o mês e o dia da data de referência (o dia do meu aniversário), usando ( right(curdate(),5) < right(’1983-09-16′,5) ). Isso pergunta se ’02-08′ < ’09-16′, e me retorna 1 ou 0. Então, se for menor, vai tirar 1 de 28, e retorna a minha idade correta: 27. Se for maior, retorna 0, e tira zero de 28, ou seja, se eu fizer esta mesma consulta depois do meu aniversário, vai me retornar 28.

Você pode criar uma funçãozinha muito útil para ser usada com maior frequência em suas consultas.

Se você quiser saber a idade que a pessoa tinha em uma determinada data, basta usar esta data no lugar de curdate().

Abraço!

Posts Relacionados:

  • Nenhum

JQuery autocomplete em ajax com php e mysql

Olá!

Pessoal, desenvolvi um novo sistema de auto complete, na forma de um plugin JQuery, o Simple AutoComplete JQuery Plugin.

O Simple AutoComplete JQuery Plugin é mais fácil de integrar e resolve os BUGs que aconteciam no IE, na funcionalidade deste tutorial.

Você pode baixá-lo e ver a documentação em : http://blog.idealmind.com.br/projetos/simple-autocomplete-jquery-plugin/

Neste tutorial vou mostrar para você como fazer um autocomplete usando JQuery e AJAX, estilizado com css, e consultando banco de dados MySQL com PHP.

O resultado final será como a imagem abaixo:
autocomplete

Antes de tudo, baixe os arquivo necessários: http://blog.idealmind.com.br/exemplos/autocomplete/autocomplete.rar

Lá você encontra os arquivos javascript e css, e também o php, uma página de exemplo e as sqls.

Bom, depois de baixado, vamos ao primeiro passo, que será criar uma tabela no banco de dados, e inserir alguns dados.

Quero deixar um agradecimento e os créditos para o pessoal do webartz (http://www.webartz.com.br/mysql/banco-mysql-de-cidades-e-estados-do-brasil/),  pois foi onde encontrei e baixei as sqls com os dados das cidades e estados do brasil.

Vamos criar uma tabela para o nosso exemplo, com os estados do Brasil:

CREATE TABLE `estados` (
	`id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
	`sigla` VARCHAR(2) NOT NULL,
	`estado` VARCHAR(45) NOT NULL,
	PRIMARY KEY (`id`),
	INDEX `ix_estado`(`estado`)
)
ENGINE = MyISAM
CHARACTER SET utf8 COLLATE utf8_general_ci;

E agora vamos inserir os estados na tabela:

INSERT INTO `estados` (id, sigla, estado ) VALUES
	(1, 'AC', 'Acre'),
	(2, 'AL', 'Alagoas'),
	(3, 'AM', 'Amazonas'),
	(4, 'AP', 'Amapá'),
	(5, 'BA', 'Bahia'),
	(6, 'CE', 'Ceará'),
	(7, 'DF', 'Distrito Federal'),
	(8, 'ES', 'Espírito Santo'),
	(9, 'GO', 'Goiás'),
	(10, 'MA', 'Maranhão'),
	(11, 'MG', 'Minas Gerais'),
	(12, 'MS', 'Mato Grosso do Sul'),
	(13, 'MT', 'Mato Grosso'),
	(14, 'PA', 'Pará'),
	(15, 'PB', 'Paraíba'),
	(16, 'PE', 'Pernambuco'),
	(17, 'PI', 'Piauí'),
	(18, 'PR', 'Paraná'),
	(19, 'RJ', 'Rio de Janeiro'),
	(20, 'RN', 'Rio Grande do Norte'),
	(21, 'RO', 'Rondônia'),
	(22, 'RR', 'Roraima'),
	(23, 'RS', 'Rio Grande do Sul'),
	(24, 'SC', 'Santa Catarina'),
	(25, 'SE', 'Sergipe'),
	(26, 'SP', 'São Paulo'),
	(27, 'TO', 'Tocantins')
;

Agora vamos criar um arquivo HTML vazio:

<html>
	<head>

	</head>
	<body>

	</body>
</html>

Agora, dentro da tag <head> vamos incluir os arquivos necessários:

	<script type="text/javascript" src="js/autocomplete.js"></script>
	<script type="text/javascript" src="js/jquery-1.3.2.min.js"></script>
	<link rel="stylesheet" type="text/css" href="css/autocomplete.css">

Quero deixar claro que o arquivo autocomplete.js deve ser chamado antes da JQuery, por questões de compatibilidade.

Feito isso, vamos criar, dentro da tag <body> o campo input onde será digitado o texto e aparecerá o autocomplete:


	<input type="text" name="campo_estado" id="campo_estado" />

Observe os valores dos atributos name e id: campo_estado. Estes valores serão a referência para a JQuery.

E agora vamos criar 3 campos, anda dentro da tag <body>, onde armazenaremos os dados referentes a opção que for selecionada no autocomplete:

	<input type="text" id="id_val" name="id" value="" /><br />
	<input type="text" id="estado_val" name="estado" value="" /><br />
	<input type="text" id="sigla_val" name="sigla" value="" />

Observe que foi criado um campo para cada resultado da consulta que o autocomplete vai fazer via AJAX, PHP e MySQL.

Ok. Agora vamos para a parte do javascript, que fará tudo funcionar. O seguinte código deve ser inserido entre as tags <head></head>, depois da chamada dos arquivos js e css que foram incluídos.


<script type="text/javascript">
$(document).ready(function(){
	// Aqui que tudo começa. Observe que usei o atributo name do campo que será digitado o texto como referência.
	new Autocomplete("campo_estado", function() {
		// Quando o autocomplete trazer o resultado da consulta, vai atribuir nos campos correspondentes
		this.setValue = function( id, estado, sigla ) {
			$("#id_val").val(id);
			$("#estado_val").val(estado);
			$("#sigla_val").val(sigla);
		}
		if ( this.isModified )
			this.setValue("");
		if ( this.value.length < 1 && this.isNotClick )
			return ;
		// O arquivo php abaixo é que será chamado via AJAX, sendo passado o parâmetro q com o valor digitado no campo
		return "ajax.php?q=" + this.value;
	});

});
</script>

Agora vamos criar o arquivo ajax.php, que receberá por GET o parâmetro q com o valor do texto que foi digitado no campo:

<?php
// Abaixo são definidas as variáveis de acesso ao banco de dados MySQL
$hostname = 'localhost';
$username = 'root';
$password = '';
$dbname = 'test';

// Abaixo o código de conexão ao banco
mysql_connect( $hostname, $username, $password ) or die ( 'Erro ao tentar conectar ao banco de dados.' );
mysql_select_db( $dbname );

// Na linha abaixo é dado um escape, para retirar caracteres que possam prejudicar a consulta sql
$q = mysql_real_escape_string( $_GET['q'] );

// Abaixo a sql que retornará os dados
$sql = "SELECT * FROM estados where locate('$q',estado) > 0 order by locate('$q',estado) limit 10";

// Abaixo executo a sql e atribuo o resultado da consulta à variável $res
$res = mysql_query( $sql );

// Para cada resultado encontrado, será gerada uma linha no autocomplete, colocando em negrito o termo digitado.
while( $campo = mysql_fetch_array( $res ) )
{
	$id = $campo['id'];
	$estado = $campo['estado'];
	$sigla = $campo['sigla'];
	$estado = addslashes($estado);
	$html = preg_replace("/(" . $q . ")/i", "<span style=\"font-weight:bold\">\$1</span>", $estado);

	// Veja que existe o atributo de evento onselect, que executará as funções de retorno no autocomplete
	echo "<li onselect=\"this.setText('$estado').setValue('$id','$estado','$sigla');\">$html ($sigla)</li>\n";
}
?>

Bom, seguindo esses passos, você poderá incluir uma funcionalidade de autocomplete poderosa em seu site. Agora basta personalizar e estilizar ao seu gosto!

Deixe seu comentário!

Posts Relacionados:

Como criar stored procedures e funções no MySQL

Olá!

Hoje vou mostrar como se faz para criar stored procedures e funções no MySQL. Stored procedures e funções são processos que você cria e ficam armazenados noMySQL, onde você pode executá-los depois. A vantagem é que o tempo de execução para consultar dados e mostrar na tela do usuário, ou executar comandos mais complexos, ficam muito mais rápidos do que se você fosse fazer via PHP, por exemplo.

Imagina se você tem que fazer uma consulta, e de acordo com cada resultado desta consulta você tem que inserir ou atualizar uma outra tabela. Ou então imagine que você tenha que fazer uma consulta e executar alguns cálculos com os dados de alguns campos. Isso dá para fazer com PHP, mas você torna o processo muito mais lento, pois para cada resultado, o php abre uma nova consulta para executar a instrução devida. No exemplo que mostrarei, vou comparar uma stored procedure com um script php, que fazem exatamente a mesma coisa.

Com uma stored procedure, você faz uma chamada só ao servidor MySQL e ele se encarrega de fazer sozinho. Stored Procedure são ótimas para se executar scripts mais complexos no banco de dados.

Com uma função, em uma única consulta você já traz os resultados prontinhos para o php somente mostrar na tela. é como se o resultado da função fosse um dado já armazenado mo MySQL.

Diferença entre stored procedures e funções

Stored procedures não retornam dados. Elas executam scripts no MySQL, que podem ser desde alterações da estrutura de tabelas, até migração de dados de uma tabela para outra, ou executar ações de acordo com os resultados de uma consulta.

Funções obrigatoriamente devem retornar dados, sejam INT, CHAR, VARCHAR, BOOLEAN etc. São ótimas para fazer comparação de dados e retornar valores, executar cálculos, consultar outras tabelas diferentes de acordo com os parâmetros passados etc.

Enfim, dá para fazer muita coisa com o MySQL através de Stored procedures e funções, que otimizam o código e o torna muito mais profissional.

Bom, vamos aos exemplos.

Criando uma Stored Procedure

Vamos supor que você queira uma tabela para armazenar quais sessões de uma aula e quantas vezes um aluno as acessou. Você armazena em uma tabela a nota do aluno para cada vez que ele faz os exercícios de cada aula.

Então temos as tabelas aula_sessao e aula_nota (além das tabelas aluno e aula, claro)

Você precisa atualizar a tabela de sessão dos exercícios para cada aula que o usuário fez, dizendo o número de vezes que o usuário fez os exercícios daquela aula.

Claro que você pode criar um Trigger para executar isso automaticamente, mas imagina se você começou a monitorar os dados de sessão da aula um tempo depois que o site já estava no ar. Você vai ter que recuperar os dados de algum lugar para a contagem não começar do zero. E para agravar ainda mais a situação, você resolveu atualizar estes dados depois que o sistema de monitoramento já estava no ar, ou seja, já possuia dados gravados. Então você tem que inserir novos registros se ainda não existirem, ou atualizar os registros se já existirem.


delimiter ;
-- Na linha abaixo eu apago a procedure caso ela exista
drop procedure if exists insereDados;

delimiter |
-- Na linha abaixo eu crio a procedure
create procedure insereDados()
 begin

-- Abaixo eu declaro as variáveis.
 DECLARE done INT DEFAULT 0;
 declare aulaId INT;
 declare alunoId INT;
 declare vezes INT;
 declare existe CHAR(1);

-- Abaixo, eu declaro um cursor que será a minha consulta de referência que atualizará a tabela aula_sessao
-- Nela eu pego o id da aula, o id do aluno, a quantidade de vezes que o aluno fez os exercícios para cada aula,
-- e verifico em uma subquery se o aluno já possui o registro daquela aula em aula_sessao

 DECLARE curs CURSOR FOR (

select
a.idaula,
a.idaluno,
count(*),
(select if(count(*)=0,'N','S') from aula_sessao where idaluno = a.idaluno and idaula = a.idaula)
from
aula_nota a
group by
a.idaluno,a.idaula

);

-- Na linha abaixo, altero o valor da variável done para um, caso nenhum resultado seja encontrado no cursor;
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

-- Ativo o cursor
 OPEN curs;

-- Começo o loop para cada resultado encontrado no cursor
 REPEAT

-- Atribuo os dados de cada campo, na ordem do select do cursor, dentro das variáveis abaixo
 FETCH curs INTO aulaId, alunoId, vezes, existe;

-- se done é falso (done = 0) executa o que está dentro do if
    if not done then
      -- se o resultado do cursor diz que não existe o dado em aula_sessao, vou inserir o registro
if existe = 'N' then
insert into aula_sessao (idaula,idaluno,sessao_exercicios) values (aulaId,usuarioId,vezes);
      -- Se já existe um registro relacionando o aluno à tabela aula_sessao, vou atualizar o registro
elseif existe = 'S' then
update aula_sessao set sessao_exercicios = vezes where idaula = aulaId and idaluno = alunoId;
end if;
    end if;
 -- até que a variavel done receba o valor TRUE (quando não existirem resultados disponíveis)
 UNTIL done END REPEAT;
-- Fecho o cursor e finalizo a stored procedure
 CLOSE curs;

 end
|

delimiter ;

Para executar a procedure, basta chamá-la assim:
CALL insereDados();

Se você quiser apagá-la depois de executada, bas dar o comando:
drop procedure if exists insereDados;

A mesma coisa no PHP (porém muito mais lento)

O código PHP abaixo faz exatamente a mesma coisa que a Stored Procedure que criamos:


<?php

$sql = "
 select
 a.idaula,
 a.idaluno,
 count(*) as vezes,
 if(s.id is null,'N','S') as existe
 from
 aula_nota a
 left join aula_sessao s on s.idaula = a.idaula and s.idaluno = a.idaluno
 group by
 a.idaluno,a.idaula
";
$res = mysql_query( $sql );

while( $r = mysql_fetch_array( $res ) )
{
 if($r['existe']=="S")
 {
 $sql = "update aula_sessao set sessao_exercicios = ".$r['vezes']." where idaula = ".$r['idaula']." and idusuario = ".$r['idaluno'];
 }
 else
 {
 $sql = "insert into aula_sessao (idaula,idaluno,sessao_exercicios) values (".$r['idaula'].",".$r['idaluno'].",".$r['vezes'].")";
 }
 mysql_query( $sql );
}

?>

A desvantagem é que a cada vez que você dá o comando mysql_query(), uma nova conexão é aberta com o banco. Então, se o resultado da primeira query tem muitas linhas, o tempo de execução será muito grande, o uso de processador será absurdo, você poderá perder dados durante o tempo de execução do script, além de poder derrubar o servidor MySQL (acontece muito na plataforma windows ou de acordo com as configurações do servidor).

Usando a Stored Procedure, além da velocidade de execução ser absurdamente maior, você mantém a consistência de dados, pois o MySQL sabe se algum dado foi inserido durante a execução do script e o atualiza também, se for o caso.

Criando uma função no MySQL

Vou mostrar um exemplo simples para ilustrar.

Vamos supor que você tem uma tabela de usuários que te traz o nivel de acesso de cada um deles. Vamos supor que temos os seguintes níveis de acessos:

0: comum
1: colaborador
2: moderador
3: administrador

Você quer apresentar esta informação para o usuário. Para fazer isso somente uma vez, basta na sql você fazer:


select
idusuario,
nome,
    email,
    (case nivel
       when 0 then 'comum'
       when 1 then 'colaborador'
       when 2 then 'moderador'
       when 3 the 'administrador'
    end) as nivelString
from
    usuario
where idusuario = 1

Você pode simplesmente criar uma função para pegar a string que diz o nivel de acesso do usuário, com a vantagem de poder usá-la em várias sqls, sem ter a necessidade de fazer o CASE toda vez que você precisar obter esse dado. Além disso, a manutenção fica muito mais simples se você quiser, por exemplo, acrescentar mais um nível de acesso. Basta alterar a função.

Então vamos criar:


delimiter ;

drop function if exists getNivelString;

delimiter |

create function getNivelString(nivel INT)
 returns varchar(45)
 begin
   declare nivelString varchar(45);
   case nivel
     when 0 then nivelString = 'comum'
     when 1 then nivelString = 'colaborador'
     when 2 then nivelString = 'moderador'
     when 3 then nivelString = 'administrador'
     else nivelString = 'comum'
   end;
   return nivelString;
end
|

delimiter ;

Agora,  a consulta pode ficar assim:

select
idusuario,
nome,
    email,
    getNivelString(idnivel) as nivelString
from
    usuario
where idusuario = 1

Lembrando que este é um exemplo bem simples diante da infinidade de coisas que se pode fazer.

Agora, o php para mostar os dados fica bem simples:


$sql = "
select
idusuario,
nome,
    email,
    getNivelString(idnivel) as nivelString
from
   usuario
where idusuario = 1
";
$campo = mysql_fetch_array( mysql_query( $sql ) );

echo "
    Olá {$campo['nome']}! Você é um usuário {$campo['nivelString']}.
";

A mesma coisa em PHP

<?php
function getNivelString($idnivel)
{
    switch( $idnivel )
    {
       case 0: $string = 'comum'; break;
       case 1: $string = 'colaborador'; break;
       case 2: $string = 'moderador'; break;
       case 3: $string = 'administrador'; break;
       default $string = 'comum'
    }
    return $string;
}

$sql = "select idusuario, nome, email, idnivel from usuario where idusuario = 1";
$campo = mysql_fetch_array( mysql_query( $sql ) );

echo "
    Olá {$campo['nome']}! Você é um usuário " . getNivelString( $campo['idnivel'] ) . ".
";
?>

Os exemplos dados aqui são apenas para demostrar como criar e usar funções e stored procedures no MySQL. Os exemplos são simples, mas você pode adaptá-los às suas necessidades.

Espero que este artigo tenha sido útil para você. Demorei um bom tempo para escrevê-lo ;)

Deixe um comentário!

Até a próxima!

Posts Relacionados:

MySQL Workbench, MySQL Administrator e MySQL Query Browser

Hoje vou apresentar, se você ainda não conhece, ferramentas muito práticas para se trabalhar com banco de dados MySQL.

Essas ferramentas são desenvolvidas pelo próprio pessoal do MySQL, e são fornecidas gratuitamente, assim como o banco de dados, sob licença GPL.

MySQL Workbench

Uma ferramenta que eu descobri há pouco tempo é o MySQL Workbench. Essa é uma ferramenta visual muito prática para criar, gerenciar e documentar um banco de dados. É intuitiva e fácil de se trabalhar. Você pode criar estruturas de dados complexas, e até importar bancos de dados existentes em sql.

Você pode fazer o download do MySQL Workbench aqui.

MySQL Administrator

É uma poderosa ferramenta de administração de banco de dados. Você pode administrar usuários, fazer e restaurar backups do banco de dados, administrar conexões, acompanhar o desempenho do banco de dados como queries lentas, reiniciar o servidor MySQL, administrar as configurações dos bancos e do servidor, e muitas outras coisas. Algumas coisas são restritas a serem usadas somente no computador local, mas dá para se fazer muita coisa remotamente também.

MySQL Query Browser

É uma ótima ferramenta para se executar queries e scripts SQL. Os resultados de um select são trazidos na própria tela, permitindo desenvolver SQLs complexas e visualizar se o resultado é o que esperamos. Além disso, é possível criar views, inserir e alterar dados, criar triggers e exportar os resultados de um select . Também é ótimo para otimização de Queries usando o comando explain.

O MySQL Administrator e o MySQL Query Browser fazem parte do pacote MySQL GUI Tools, que inclui também mais uma ferramenta chamada MySQL Migration Toolkit (o próprio nome já diz para que serve – mas nunca usei, então não posso escrever sobre ele).

Você pode fazer o download do MySQL GUI Tools clicando aqui.

Veja abaixo alguns screenshots dos 3 programas:

Abraços e até a próxima!

Posts Relacionados:

Como executar vários arquivos sql em um comando único pelo CMD do windows

24, setembro, 2009 4 comentários

Olá!

Hoje vou mostrar para você uma maneira fácil e rápida para rodar vários arquivos sql em um servidor mysql através de um único comando, através do prompt de comando do windows (cmd).

A necessidade surgiu devido a uma reestruturação do banco de dados, onde vários arquivos sql são responsáveis pela criação e importação de dados, criação de novas tabelas, alteração da estrutura de tabelas dentre outras coisas. Era muito chato a cada alteração ou testes de um dos arquivos ter que apagar o banco, recriar e rodar todos os arquivos um por um.

Então vamos lá!

Primeiro vamos criar um novo banco para o exemplo, chamado meubanco:

DROP DATABASE IF EXISTS `meubanco`;
CREATE DATABASE `meubanco`;

Salve este arquivo, por exemplo, em C:\dados\meubanco\meubanco.sql (use um editor como o notepad para salvar).

CREATE TABLE  `tabela1` (
  id INT(11) NOT NULL AUTO_INCREMENT,
  descricao VARCHAR(45) NOT NULL,
  data DATETIME,
  PRIMARY KEY id,
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE  `tabela2` (
  id INT(11) NOT NULL AUTO_INCREMENT,
  descricao VARCHAR(45) NOT NULL,
  data DATETIME,
  PRIMARY KEY id,
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Salve este arquivo, por exemplo, em C:\dados\meubanco\meubanco_estrutura.sql (para tornar mais fácil o processo, salve todos os arquivos sql na mesma pasta).

Agora vamos inserir alguns dados nas tabelas:


INSERT INTO tabela1 (descricao,data) VALUES
('Esta é a linha 1 da tabela 1','2009-09-16 13:45:12'),
('Esta é a linha2 da tabela 1',now()),
('Esta é a linha 3 da tabela 1',now()),
('Esta é a linha 4 da tabela 1',now());

INSERT INTO tabela2 (descricao,data) VALUES
 ('Esta é a linha 1 da tabela 2','2009-09-23 23:12:30'),
 ('Esta é a linha2 da tabela 2',now()),
 ('Esta é a linha 3 da tabela 2',now()),
 ('Esta é a linha 4 da tabela 2',now());

Salve este arquivo, por exemplo, em C:\dados\meubanco\meubanco_dados.sql .

Agora suponhamos que você tenha feito a seguinte alteração na estrutura:


ALTER TABLE `tabela1` ADD COLUMN `usuario` INT(11) , ADD INDEX `ix_usuario`(`usuario`);

ALTER TABLE `tabela2` ADD COLUMN `id_tabela1` INT(11) , ADD INDEX `ix_id_tabela1`(`id_tabela1`);

Salve este arquivo, por exemplo, em C:\dados\meubanco\meubanco_alteracao.sql, na mesma pasta que os outros.

Este exemplo é bem simples perto da real necessidade de se rodar vários arquivos sql, mas serve apenas para ilustrar uma situação em que realmente exista esta necessidade (como foi o meu caso, onde várias pessoas fizeram várias alterações em partes diferentes da estrutura de dados, e era necessário reestruturar o banco algumas vezes no mesmo dia, e várias vezes para testar localmente para não correr risco de perder os dados existentes no servidor live).

Voltando ao exemplo, abra o prompt de comando do windows (Iniciar => Executar => cmd), e teste se você consegue executar o mysql de qualquer pasta:

C:\Documents and Settings\usuario>mysql – u root

Se você usa senha, use -p no final do comando. Verifique se sua tela ficou parecida com a tela abaixo:

C:\Documents and Settings\usuario>mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 26
Server version: 5.1.32-community MySQL Community Server (GPL)Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.
mysql>

Se você não conseguiu, você terá de setar o caminho para o mysql como uma variável de ambiente do windows. Para isso, entre no Painel de controle e abra Sistema (ou tecle simultaneamente a tecla com o logo do windows e a tecla Pause Break). Vá na guia Avançado e clique em Variáveis de Ambiente. Na janela que abre, selecione Path em Variáveis do sistema e clique em Editar. Na nova janela que abrir, em Valor da variável, acrescente o caminho para o mysql (no meu caso, C:\Arquivos de programas\MySQL\MySQL Server 5.1\bin). Certifique-se de que exista um ; separando o caminho que você acrescentou e os que já existiam, e que não existem espaços em branco antes e depois de ;. Salve e dê ok nas janelas. Pronto. Feche o cmd e tente novamente. Se conseguir, de exit para voltar a pasta e vá até a pasta dos arquivos sql:

mysql> exit
Bye

C:\Documents and Settings\usuario>cd C:\dados\meubanco

C:\dados\meubanco>

Agora vamos criar o arquivo *.bat que fará a execução dos scripts sqls. Abra o bloco de notas ou seu editor preferido, e digite nele:


@echo OFF
echo Criando o banco de dados...
mysql -u root < meubanco.sql
echo Criando a estrutura de dados...
mysql -u root meubanco < meubanco_estrutura.sql
echo Inserindo os dados...
mysql -u root meubanco < meubanco_dados.sql
echo Alterando a estrutura...
 mysql -u root meubanco < meubanco_alteracao.sql
echo Fim do Script!

Salve o arquivo como cria_meubanco.bat. Volte ao prompt do windows, digite cria_meubanco e voilá! Se tudo correu bem, você verá a tela abaixo:

C:\dados\meubanco>cria_meubanco

Criando o banco de dados…
Criando a estrutura de dados…
Inserindo os dados…
Alterando a estrutura…
Fim do Script!

C:\dados\meubanco>

Pronto! Você acabou de criar um arquivo em lotes executável pelo prompt do windows, que poderá te poupar muito tempo no seu dia a dia de desenvolvedor.

Deixe seu comentário!

Até a próxima!

Related Posts Plugin for WordPress, Blogger...

Posts Relacionados:

SEO Powered by Platinum SEO from Techblissonline