Ir para conteúdo

POWERED BY:

Arquivado

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

camilofernandesalves

Problemas em consulta com mysql

Recommended Posts

Segue o code

 

if (isset($_POST['resto']) && isset($_POST['comp']))
{
    $assunto = $_POST['assunto'];
    $msg = $_POST['comp'];
    if ($resto == 'regiao')
    {
        $regiao = $reg['regiao'];
        $nacao = "";
        $tribo = "";
    }
    if ($resto == 'nacao')
    {
        $regiao = $reg['regiao'];
        $nacao = $reg['nacao'];
        $tribo = "";
    }
    if ($resto == 'tribo')
    {
        $regiao = $reg['regiao'];
        $nacao = $reg['nacao'];
        $tribo = $reg['tribo'];
    }
    echo $regiao;
    echo $nacao;
    echo $tribo;
    include ("../../fnc/conect.php");
    $sql = mysql_query("SELECT * FROM users WHERE regiao = '$regiao' AND '$nacao' AND tribo = '$tribo'") or die (mysql_error());
    while($reg = mysql_fetch_array($sql))

Olha a idéia, eu quero que caso seja enviado nação ou região venha colocar nas respectivas variáveis um valor semelhante ao comando *.* em MSDOS só que em MySQL para que todos os campos com qualquer valor venha ser pesquisado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha só o que eu quero por exemplo

 

SELECT * FROM tabela WHERE campo = 'valor'

 

Gostaria de saber se tem como 'valor' ser algum comando em MySQL sei lá aonde ele deixa isso como se fosse para todos

assim como lá no MSDOS tem o *.* aonde ele seleciona tudo que ele encontrar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gostaria de saber se tem como 'valor' ser algum comando em MySQL sei lá aonde ele deixa isso como se fosse para todos

assim como lá no MSDOS tem o *.* aonde ele seleciona tudo que ele encontrar

 

uê..

SELECT * FROM `tabela`

é só fazer sem WHERE nenhum ne?!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Willian é nessa idéia meu colega, só tem um problema cara olha só tipo teria eu quero fazer algo automático sabe sem a necessidade de várias consultas no banco de dados, já tentei fazer com que as variáveis já fossem enviadas com o nome do campo o AND e o varlor

iria ficar assim

 


    if ($resto == 'regiao')
    {
        $regiao = "regiao = '". $reg['regiao']. "'";
        $nacao = "";
        $tribo = "";
    }
    echo $regiao;
    echo $nacao;
    echo $tribo;
    include ("../../fnc/conect.php");
    $sql = mysql_query("SELECT * FROM users WHERE ". $regiao ." ". $nacao ." ". $tribo) or die (mysql_error());
    while($reg = mysql_fetch_array($sql))

Não foi exatamente assim mais foi nessa idéia sabe mais deu erro no server.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rapaz.. essa linha:

$sql = mysql_query("SELECT * FROM users WHERE ". $regiao ." ". $nacao ." ". $tribo) or die (mysql_error());
não faz sentido..

você quer selecionar essas 3 colunas apenas? então você deveria fazer:

$sql = mysql_query("SELECT regiao, nacao, tribo FROM users ") or die (mysql_error());
Ou então, posta a estrutura da tabela, e alguns registros para exemplificar...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estrutura MYSQL

 -- 
 -- Estrutura da tabela `jovens`
 -- 
 
 CREATE TABLE `jovens` (
   `id` int(8) unsigned zerofill NOT NULL auto_increment,
   `nome` varchar(40) NOT NULL,
   `endereco` varchar(80) NOT NULL,
   `regiao` varchar(40) NOT NULL,
   `email` varchar(40) NOT NULL,
   `telefone` varchar(8) NOT NULL,
   `celular` varchar(8) NOT NULL,
   `nacao` varchar(1) NOT NULL,
   `tribo` varchar(20) NOT NULL,
   PRIMARY KEY  (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
 
 -- 
 -- Estrutura da tabela `users`
 -- 
 
 CREATE TABLE `users` (
   `login` varchar(15) NOT NULL,
   `senha` varchar(8) NOT NULL,
   `nome` varchar(40) NOT NULL,
   `email` varchar(40) NOT NULL,
   `regiao` varchar(30) NOT NULL,
   `acesso` varchar(1) NOT NULL,
   `nacao` varchar(1) NOT NULL,
   `tribo` varchar(15) NOT NULL,
   PRIMARY KEY  (`login`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Olha só a respeito do post anterior essa idéia eu já tentei só que há dois problemas:

Tem que ser nas duas tabelas a users e jovens

e outro é que eu preciso do WHERE para colocar os argumento de pesquisa

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só uma pergunta:

Porque você definiu o campo 'login' como primary key e não criou um campo 'id'?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já existem muitos registros? Se der para alterar isso, ficaria bem melhor.

Criar um campo 'id' primary key e auto_increment seria ótimo.

 

Quando é efetuado um cadastro a inserção acontece nas duas tabelas simultaneamente?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se eu entendi bem você quer fazer o seguinte:

Independente do que o usuário digitar no campo de busca, ele terá os resultados

da busca vindo vindo de todas as linhas das duas tabelas, mais precisamente das

colunas 'regiao' 'nacao' e 'tribo'. Correto?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas qual campo relaciona as 2 tabelas ?

tentou fazer um JOIN ?

 

Faça querys distintas, controlado com IF, caso precise selecionar clausulas com o WHERE, e caso queria mostrar todos os registros.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cláudio é exatamente isso!

Para no final enviar emails como mala direta

mais por exemplo se ele for da região x ele enviar para os usuários da região x

se não ele não envia

o problema disso tudo é que tem acessos diferentes

então vai ter um usuário que vai enviar para todos

e outro só para todos do mesmo país idepedentimente de tribo é muito complicado.

 

Mais o que eu preciso é o seguinte é que no momento do select exista um comando para simplismente falar que qualquer valor se adeque aquele parametro

ex:

 

SELECT * FROM users WHERE regiao = '$regiao' AND '$nacao' AND tribo = '$tribo'

 

quando o usuário for admin quer dizer "manda para todos"

ele simplismente vai só selecionar a regiao

e mandar bronca

então $nação e $tribo teria que ser algo como *.* em DOS entende?

quer dizer todo registro vai ser classificado nele idepedentemente da nacao ou tribo

mais a regiao tem que obedecer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi mais ou menos... Faça assim. Ia explicar, mas dar um exemplo é mais fácil...

$sql ="SELECT * FROM users WHERE regiao = '$regiao'";
if (aqui você coloca a clásula, tipo, se estiver não for admim... sei lá){
   $sql.= " AND nacao = '$nacao'";
}

 

Ou seja, se não for admin ou sei lá qual outra condição tenha que seguir, você concatena a $sql. Depois de tudo, você joga a $sql dentro do mysql_query e executa.

 

Mais ou menos por aí

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para no final enviar emails como mala direta

mais por exemplo se ele for da região x ele enviar para os usuários da região x

se não ele não envia

o problema disso tudo é que tem acessos diferentes

então vai ter um usuário que vai enviar para todos

e outro só para todos do mesmo país idepedentimente de tribo é muito complicado.

 

Bom.....

 

Você tem uma tabela de usuários:

mysql> select * from users;
+-------+-------+------------------+----------------------+--------+--------+-------+-------+
| login | senha | nome             | email                | regiao | acesso | nacao | tribo |
+-------+-------+------------------+----------------------+--------+--------+-------+-------+
| u1    | asfda | Usuario limitado | limitado@dominio.com | regiao | 0      | n     | tribo |
| u2    | asdf  | Eu sou o cara    | master@dominio.com   | teste  | 1      | n     | tribo |
+-------+-------+------------------+----------------------+--------+--------+-------+-------+
2 rows in set (0.00 sec)

E você tem uma tabela de jovens:

mysql> select * from jovens;
+----------+----------+------------------+--------+--------------------+----------+---------+-------+-------+
| id       | nome     | endereco         | regiao | email              | telefone | celular | nacao | tribo |
+----------+----------+------------------+--------+--------------------+----------+---------+-------+-------+
| 00000001 | Fulano   | Rua dos bobos, 0 | teste  | teste@teste.com    | 11       | 22      | b     | tribo |
| 00000002 | Ciclano  | Av principal, 1  | regiao | email@teste.com    | 11       | 22      | n     | tribo |
| 00000003 | Beltrano | Lugar nenhum     | regiao | beltrano@teste.com | 11       | 22      | n     | tribo |
+----------+----------+------------------+--------+--------------------+----------+---------+-------+-------+
3 rows in set (0.01 sec)

Ai você quer que o "Usuário limitado" só possa enviar emails para outros jovens que são da mesma região e nação, no caso dos dados acima, o "Usuário limitado" só poderá enviar emails para o "Ciclano" e para o "Beltrano" porque eles são da mesma região e nação do "Usuário limitado".

O outro ponto que você quer, é que se o nosso usuário "Eu sou o cara" possa enviar emails para qualquer jovem, independente de nação ou região, porque ele tem acesso 1.

 

Ok:

 

mysql> select u.`login`,u.`nome`,u.`regiao` "usuario_regiao",u.`nacao` "usuario_nacao",j.`nome` "jovem",j.`email`,j.`regiao` "jovem_regiao",j.`nacao` "jovem_nacao",j.`tribo` from `users` u join `jovens` j on ( ( j.`regiao` = u.`regiao` ) AND ( j.`nacao` = u.`nacao` ) ) OR if( u.`acesso` = 1 , 1 , 0 ) where u.`login` = 'u1';                                                                                                                                               
+-------+------------------+----------------+---------------+----------+--------------------+--------------+-------------+-------+                          
| login | nome             | usuario_regiao | usuario_nacao | jovem    | email              | jovem_regiao | jovem_nacao | tribo |                          
+-------+------------------+----------------+---------------+----------+--------------------+--------------+-------------+-------+                          
| u1    | Usuario limitado | regiao         | n             | Ciclano  | email@teste.com    | regiao       | n           | tribo |                          
| u1    | Usuario limitado | regiao         | n             | Beltrano | beltrano@teste.com | regiao       | n           | tribo |
+-------+------------------+----------------+---------------+----------+--------------------+--------------+-------------+-------+
2 rows in set (0.00 sec)

mysql> select u.`login`,u.`nome`,u.`regiao` "usuario_regiao",u.`nacao` "usuario_nacao",j.`nome` "jovem",j.`email`,j.`regiao` "jovem_regiao",j.`nacao` "jovem_nacao",j.`tribo` from `users` u join `jovens` j on ( ( j.`regiao` = u.`regiao` ) AND ( j.`nacao` = u.`nacao` ) ) OR if( u.`acesso` = 1 , 1 , 0 ) where u.`login` = 'u2';
+-------+---------------+----------------+---------------+----------+--------------------+--------------+-------------+-------+
| login | nome          | usuario_regiao | usuario_nacao | jovem    | email              | jovem_regiao | jovem_nacao | tribo |
+-------+---------------+----------------+---------------+----------+--------------------+--------------+-------------+-------+
| u2    | Eu sou o cara | teste          | n             | Fulano   | teste@teste.com    | teste        | b           | tribo |
| u2    | Eu sou o cara | teste          | n             | Ciclano  | email@teste.com    | regiao       | n           | tribo |
| u2    | Eu sou o cara | teste          | n             | Beltrano | beltrano@teste.com | regiao       | n           | tribo |
+-------+---------------+----------------+---------------+----------+--------------------+--------------+-------------+-------+
3 rows in set (0.00 sec)

Se for isso:

select
   u.`login`,u.`nome`,u.`regiao` "usuario_regiao",u.`nacao` "usuario_nacao",
   j.`nome` "jovem",j.`email`,j.`regiao` "jovem_regiao",j.`nacao` "jovem_nacao",j.`tribo`
from
   `users` u
join
   `jovens` j
on
   ( ( j.regiao = u.regiao ) AND ( j.nacao = u.nacao ) ) OR if( u.acesso = 1 , 1 , 0 )
where
   u.login = 'u2'

 

Porém é fundamental que você modifique sua tabela e adicione um indice:

alter table `jovens` add index `jovens_rnt`(`regiao`, `nacao`, `tribo`);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para no final enviar emails como mala direta

mais por exemplo se ele for da região x ele enviar para os usuários da região x

se não ele não envia

o problema disso tudo é que tem acessos diferentes

então vai ter um usuário que vai enviar para todos

e outro só para todos do mesmo país idepedentimente de tribo é muito complicado.

 

Bom, eu só tive essa idéia depois de ter enviado a resposta anterior, mas acho que isso aqui resolve definitivamente:

Utilizar sua coluna de acesso e fazer uma comparação binária você irá conseguir resolver a situação de:

 

1. Um usuário pode enviar emails para jovens da mesma região, nação e tribo

2. Um usuário pode enviar emails para jovens da mesma região e nação independente de tribo

2. Um usuário pode enviar emails para jovens da mesma região e tribo, independente de nação

3. Um usuário pode enviar emails para jovens da mesma nação e tribo, independente da região

4. Um usuário.....

 

Resumindo, definimos algumas bit-flags:

 

região = 1

nação = 2

tribo = 4

 

Agora fazemos algumas contas:

mysql> select 1 | 2;
+-------+
| 1 | 2 |
+-------+
|     3 |
+-------+
1 row in set (0.00 sec)

mysql> select 1 | 2 | 4;
+-----------+
| 1 | 2 | 4 |
+-----------+
|         7 |
+-----------+
1 row in set (0.00 sec)

mysql> select 2 | 4;
+-------+
| 2 | 4 |
+-------+
|     6 |
+-------+
1 row in set (0.00 sec)

Assim, se o usuário tiver acesso 0 ele poderá enviar para emails para jovens da mesma região, nação e tribo.

Se o usuário tiver acesso 7 ( 1 | 2 | 4 ) ele pode enviar para todo mundo

Se o usuário tiver acesso 6 (2 | 4 ) ele pode enviar para jovens da mesma região, porém para qualquer nação ou tribo.

 

A consulta ficaria assim:

 

select
   u.`login`,u.`nome`,u.`regiao` "usuario_regiao",u.`nacao` "usuario_nacao", u.`tribo` "usuario_tribo",
   j.`nome` "jovem",j.`email`,j.`regiao` "jovem_regiao",j.`nacao` "jovem_nacao",j.`tribo` "jovem_tribo"
from
   `users` u
join
   `jovens` j
on   
   (
   ( ( u.acesso & 1 ) OR ( j.regiao = u.regiao ) ) AND
   ( ( u.acesso & 2 ) OR ( j.nacao = u.nacao ) ) AND
   ( ( u.acesso & 4 ) OR ( j.tribo = u.tribo ) )
   )
where
   u.login = 'u2'

 

E seus dados:

 

mysql> select * from users;
+-------+----------+-----------------+----------------------+--------+--------+-------+-------+
| login | senha    | nome            | email                | regiao | acesso | nacao | tribo |
+-------+----------+-----------------+----------------------+--------+--------+-------+-------+
| u1    | asfda    | Minha regiao    | limitado@dominio.com | regiao | 1      | a     | pop   |
| u2    | asdf     | Eu sou o cara   | master@dominio.com   | teste  | 7      | b     | blues |
| u3    | sadfsadf | Qualquer nacao  | qqrnacao@dominio.com | teste  | 2      | c     | jazz  |
| u4    | kjhkj    | Todas as tribos | tribos@dominio.com   | nada   | 6      | d     | metal |
+-------+----------+-----------------+----------------------+--------+--------+-------+-------+
4 rows in set (0.00 sec)

mysql> select * from jovens;
+----------+----------+------------------+--------+----------------------+----------+---------+-------+-------+
| id       | nome     | endereco         | regiao | email                | telefone | celular | nacao | tribo |
+----------+----------+------------------+--------+----------------------+----------+---------+-------+-------+
| 00000001 | Fulano   | Rua dos bobos, 0 | teste  | teste@teste.com      | 11       | 22      | a     | metal |
| 00000002 | Ciclano  | Av principal, 1  | essa   | email@teste.com      | 11       | 22      | a     | pop   |
| 00000003 | Beltrano | Lugar nenhum     | regiao | beltrano@teste.com   | 11       | 22      | a     | pop   |
| 00000004 | Teste    | asdf             | nada   | asdfasf@asdfadsf.com | 11       | 22      | d     | pop   |
| 00000005 | Aquele   | asfdasdf         | teste  | asdf@tasdf.com.br    | 11       | 22      | a     | jazz  |
| 00000006 | Mais um  | 2345sdfgsaf      | teste  | asdf                 | 11       | 22      | e     | jazz  |
| 00000007 | Mane     | asdf             | nada   | adsf                 | 11       | 22      | h     | samba |
+----------+----------+------------------+--------+----------------------+----------+---------+-------+-------+
7 rows in set (0.00 sec)

Como o usuário "u2" tem acesso 7 ele pode enviar para todo mundo:

 

mysql> select u.`login`,u.`nome`,u.`regiao` "usuario_regiao",u.`nacao` "usuario_nacao", u.`tribo` "usuario_tribo", j.`nome` "jovem",j.`email`,j.`regiao` "jovem_regiao",j.`nacao` "jovem_nacao",j.`tribo` "jovem_tribo" from `users` u join `jovens` j on ( ( ( u.acesso & 1 ) OR ( j.regiao = u.regiao ) ) AND ( ( u.acesso & 2 ) OR ( j.nacao = u.nacao ) ) AND ( ( u.acesso & 4 ) OR ( j.tribo = u.tribo ) ) ) where u.login = 'u2';
+-------+---------------+----------------+---------------+---------------+----------+----------------------+--------------+-------------+-------------+
| login | nome          | usuario_regiao | usuario_nacao | usuario_tribo | jovem    | email                | jovem_regiao | jovem_nacao | jovem_tribo |
+-------+---------------+----------------+---------------+---------------+----------+----------------------+--------------+-------------+-------------+
| u2    | Eu sou o cara | teste          | b             | blues         | Fulano   | teste@teste.com      | teste        | a           | metal       |
| u2    | Eu sou o cara | teste          | b             | blues         | Ciclano  | email@teste.com      | essa         | a           | pop         |
| u2    | Eu sou o cara | teste          | b             | blues         | Beltrano | beltrano@teste.com   | regiao       | a           | pop         |
| u2    | Eu sou o cara | teste          | b             | blues         | Teste    | asdfasf@asdfadsf.com | nada         | d           | pop         |
| u2    | Eu sou o cara | teste          | b             | blues         | Aquele   | asdf@tasdf.com.br    | teste        | a           | jazz        |
| u2    | Eu sou o cara | teste          | b             | blues         | Mais um  | asdf                 | teste        | e           | jazz        |
| u2    | Eu sou o cara | teste          | b             | blues         | Mane     | adsf                 | nada         | h           | samba       |
+-------+---------------+----------------+---------------+---------------+----------+----------------------+--------------+-------------+-------------+
7 rows in set (0.00 sec)

Mas o usuário "u1" só pode enviar emails para jovens da mesma nação e tribo porém para qualquer região:

 

mysql> select u.`login`,u.`nome`,u.`regiao` "usuario_regiao",u.`nacao` "usuario_nacao", u.`tribo` "usuario_tribo", j.`nome` "jovem",j.`email`,j.`regiao` "jovem_regiao",j.`nacao` "jovem_nacao",j.`tribo` "jovem_tribo" from `users` u join `jovens` j on ( ( ( u.acesso & 1 ) OR ( j.regiao = u.regiao ) ) AND ( ( u.acesso & 2 ) OR ( j.nacao = u.nacao ) ) AND ( ( u.acesso & 4 ) OR ( j.tribo = u.tribo ) ) ) where u.login = 'u1';
+-------+--------------+----------------+---------------+---------------+----------+--------------------+--------------+-------------+-------------+
| login | nome         | usuario_regiao | usuario_nacao | usuario_tribo | jovem    | email              | jovem_regiao | jovem_nacao | jovem_tribo |
+-------+--------------+----------------+---------------+---------------+----------+--------------------+--------------+-------------+-------------+
| u1    | Minha regiao | regiao         | a             | pop           | Ciclano  | email@teste.com    | essa         | a           | pop         |
| u1    | Minha regiao | regiao         | a             | pop           | Beltrano | beltrano@teste.com | regiao       | a           | pop         |
+-------+--------------+----------------+---------------+---------------+----------+--------------------+--------------+-------------+-------------+
2 rows in set (0.00 sec)

O usuário "u4" tem acesso 6 (4 | 2) então ele pode enviar para qualquer nação e para qualquer tribo, mas da mesma região:

 

mysql> select u.`login`,u.`nome`,u.`regiao` "usuario_regiao",u.`nacao` "usuario_nacao", u.`tribo` "usuario_tribo", j.`nome` "jovem",j.`email`,j.`regiao` "jovem_regiao",j.`nacao` "jovem_nacao",j.`tribo` "jovem_tribo" from `users` u join `jovens` j on ( ( ( u.acesso & 1 ) OR ( j.regiao = u.regiao ) ) AND ( ( u.acesso & 2 ) OR ( j.nacao = u.nacao ) ) AND ( ( u.acesso & 4 ) OR ( j.tribo = u.tribo ) ) ) where u.login = 'u4';
+-------+-----------------+----------------+---------------+---------------+-------+----------------------+--------------+-------------+-------------+
| login | nome            | usuario_regiao | usuario_nacao | usuario_tribo | jovem | email                | jovem_regiao | jovem_nacao | jovem_tribo |
+-------+-----------------+----------------+---------------+---------------+-------+----------------------+--------------+-------------+-------------+
| u4    | Todas as tribos | nada           | d             | metal         | Teste | asdfasf@asdfadsf.com | nada         | d           | pop         |
| u4    | Todas as tribos | nada           | d             | metal         | Mane  | adsf                 | nada         | h           | samba       |
+-------+-----------------+----------------+---------------+---------------+-------+----------------------+--------------+-------------+-------------+
2 rows in set (0.00 sec)

Acho que é isso...

 

:P

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.