Ir para conteúdo

POWERED BY:

Arquivado

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

Hussay

PDO = Realizar select simultaneo em dois bancos distintos

Recommended Posts

Estou precisando realizar um select simultaneo e não estou conseguindo:

//Conexao
define('HOSTT','localhost');
define('USERT','root');
define('PASST','');
	
$dsn = 'mysql:host='.HOSTT;
	 
	try {
			$bd = new PDO($dsn,USERT,PASST); 
			$bd->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
	} catch (PDOException $e) {
			echo htmlentities('Houve algum erro com a conexao com o banco de dados: '. $e->getMessage());
	}
//fim conexao

 

Eu não coloquei o nome do banco de dados, porque estou tentando trabalhar com dois bancos que estão no mesmo servidor com o mesmo usuário e senha.

 

Agora o meu select está sendo realizado assim

$query = "SELECT  CONCAT(' ',shopping.lojas.fantasia,' ',shopping.lojas.cep,' ',shopping.lojas.bairro,' ',shopping.lojas.cidade,' ',shopping.lojas.estado,' ',shopping.lojas.ruas,' ',shopping.lojas.bairros,' ',shopping.lojas.estados,' ',(SELECT shopping.categorias.nome_cat FROM shopping.categorias WHERE categorias.id = lojas.categoria),' ',shopping.lojas.produtos,' ',shopping.lojas.preco,' ',shopping.lojas.imagens,' ',shopping.lojas.site,' ',shopping.lojas.email,' ',shopping.lojas.twitter,' ',shopping.lojas.facebook,' ',shopping.lojas.comentario,' ',shopping.lojas.imagens_estabelecimentos,' ') as todos_juntos, id_estabelecimentos FROM shopping.lojas HAVING $condicao_busca LIMIT 10";

$query2 = $bd->query($query);

 

O erro ocasionado é o seguinte:

 

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s)' in C:\wamp\www\Shopping2\rpc4.php on line 132 (Essa linha é a com o código $query2 = $bd->query($query) ;)

 

e

 

PDOException: SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s) in C:\wamp\www\Shopping2\rpc4.php on line 132

 

Vale ressaltar que a parte do código problemática é a (SELECT * FROM cep.enderecos WHERE cep.enderecos.cep='47310-180') que está tentando consultar uma base de dados diferente ("cep"), sendo que os outros elementos estão consultando a base de dados "shopping".

 

 

Alguém pode me ajudar a resolver esse problema?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos por assim para ficar mais fácil entender...

 

 
SELECT 
  CONCAT(
    ' ',
    shopping.lojas.fantasia,
    ' ',
    shopping.lojas.cep,
    ' ',
    shopping.lojas.bairro,
    ' ',
    shopping.lojas.cidade,
    ' ',
    shopping.lojas.estado,' '
    ,shopping.lojas.ruas,
    ' ',
    shopping.lojas.bairros,' '
    ,shopping.lojas.estados,' ',
    (
      SELECT shopping.categorias.nome_cat
      FROM shopping.categorias
      WHERE categorias.id = lojas.categoria
    ),
    ' ',
    shopping.lojas.produtos,
    ' ',
    shopping.lojas.preco,
    ' ',
    shopping.lojas.imagens,
    ' ',
    shopping.lojas.site,
    ' ',
    shopping.lojas.email,
    ' ',
    shopping.lojas.twitter,
    ' ',
    shopping.lojas.facebook,
    ' ',
    shopping.lojas.comentario,
    ' ',
    shopping.lojas.imagens_estabelecimentos,
    ' '
  ) AS todos_juntos,
  id_estabelecimentos
  FROM shopping.lojas
  HAVING $condicao_busca
  LIMIT 10

 

 

Nessa consulta SQL que está na variável $query, o que tem em $condicao_busca?

 

Essa parte que você diz que é a problemática não está no código que você colocou acima...

 

Tente trocar o CONCAT pelo CONCAT_WS, além de poupar-lhe de ficar repetindo o whitespace ' ' (você precisa manter só o primeiro), ele ainda elimina os valores nulos (caso o problema esteja nessa subquery dentro do concat).

Compartilhar este post


Link para o post
Compartilhar em outros sites

rsrsrsrs, foi sem querer.

O código ficou tão grande que me esqueci de colar o certo.

Em $condicao_busca é para colocar todos_juntos LIKE '%teste%'.

 

O código é este abaixo:

 

SELECT 
CONCAT_WS
( 
' ', 
shopping.lojas.fantasia, 
(SELECT * FROM cep.enderecos WHERE cep.enderecos.cep='47310-180'),
shopping.lojas.rua, 
shopping.lojas.bairro, 
shopping.lojas.cidade, 
shopping.lojas.estado, 
shopping.lojas.ruas, 
shopping.lojas.rua2, 
shopping.lojas.bairros, 
shopping.lojas.estados, 
(SELECT shopping.categorias.nome_cat FROM shopping.categorias WHERE categorias.id = lojas.categoria),
shopping.lojas.produtos, 
shopping.lojas.produtos, 
shopping.lojas.preco, 
shopping.lojas.imagens, 
shopping.lojas.site, 
shopping.lojas.email, 
shopping.lojas.twitter, 
shopping.lojas.facebook, 
shopping.lojas.comentario, 
shopping.lojas.imagens_estabelecimentos 
)AS todos_juntos, 
id_estabelecimentos   
FROM shopping.lojas 
HAVING todos_juntos LIKE '%teste%' 
LIMIT 10

 

 

Ainda não funcionou

Compartilhar este post


Link para o post
Compartilhar em outros sites

Executar esse teste diretamente no mysql dá o mesmo erro? só pra isolar o problema...

 

Outra coisa, se você tirar o HAVING, retorna o que?

 

E uma outra pergunta (essa só por curiosidade): por que você está separando o seus sistema em tantos banco de dados. Para mim tudo ficariam perfeitamente bem em um banco de dados só... por exemplo aí você criou um banco de dados só para CEP, por que isso foi necessário?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Executar esse teste diretamente no mysql dá o mesmo erro? só pra isolar o problema...

 

Outra coisa, se você tirar o HAVING, retorna o que?

 

E uma outra pergunta (essa só por curiosidade): por que você está separando o seus sistema em tantos banco de dados. Para mim tudo ficariam perfeitamente bem em um banco de dados só... por exemplo aí você criou um banco de dados só para CEP, por que isso foi necessário?

 

Diretamente no mysql deu o seguinte erro (Eu coloquei um cep válido):

#1241 - Operand should contain 1 column(s)

 

Sem o HAVING retorna erro de sintaxe.

 

Esse banco de dados de cep eu uso para várias aplicações distintas e por ser um banco bem grande, eu achei melhor ter ele independente. :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Até onde eu saiba, o MySQL não suporta selecionar vários campos em uma sub-select para agregar na consulta principal.

Em outras palavras, o erro tá aqui:

(SELECT * FROM cep.enderecos WHERE cep.enderecos.cep='47310-180'),

 

O certo é você fazer uma consulta para cada campo, ou concatenar o que quiser:

(SELECT c.logradouro FROM cep.enderecos c WHERE cep.enderecos.cep='47310-180') as logradouro,
(SELECT c.bairro FROM cep.enderecos c WHERE cep.enderecos.cep='47310-180') as bairro
...

 

@braços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Até onde eu saiba, o MySQL não suporta selecionar vários campos em uma sub-select para agregar na consulta principal.

Em outras palavras, o erro tá aqui:

(SELECT * FROM cep.enderecos WHERE cep.enderecos.cep='47310-180'),

 

O certo é você fazer uma consulta para cada campo, ou concatenar o que quiser:

(SELECT c.logradouro FROM cep.enderecos c WHERE cep.enderecos.cep='47310-180') as logradouro,
(SELECT c.bairro FROM cep.enderecos c WHERE cep.enderecos.cep='47310-180') as bairro
...

 

@braços

 

Excelente solução. rsrsrsrs.

Tem hora que os detalhes acabam passando despercebidos.

Problema resolvido.

 

Muito Obrigado pessoal!!!!!!!!!!!!!!!!!!!!!!

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.