Problema com consulta SQL Composta (MySQL)

13/06/2016

0

Prezados:

1 - Primeiramente, desde já, muito obrigado pela ajuda.
2 - No sistema atual, ao inserir o código em um campo específico, a página é redirecionada para o endereço de amostra do produto;
3 - O intuito é ter um único campo de palavra chave que receberá também o código do produto;
4 - Se a nova consulta trouxer um único produto, a página será redirecionada, de outra forma os produtos achados serão amostrados, ou uma mensagem dizendo que nenhum produto com a palavra chave, ou código, foi encontrado;
5 - A consulta verifica a grade do produto (uma outra tabela), porém sem "INNER JOIN" (coloquei dois códigos diferentes, um sem e um com "INNER JOIN", ambos trazem o
)
6 - O problema de utilizar com "INNER JOIN" é que trás mais de um valor e eu queria evitar utilizar o DISTINCT (tenho impressão de que ele deixa a consulta mais lenta, ainda que só um pouco).

* Código sem INNER JOIN
SELECT p.id, p.nome_prod, g.description, p.lnk, p.foto 
FROM produtos AS p
WHERE p.id LIKE CONCAT('%','ARO1000','%') 
	OR (p.fk_grp_prod = 2
		AND (
				OR p.org_id LIKE CONCAT('%','ARO1000','%') 
				OR p.nome_prod LIKE CONCAT('%','ARO1000','%') 
				OR p.description LIKE CONCAT('%','ARO1000','%') 
				OR p.ctg LIKE CONCAT('%','ARO1000','%') 
				OR p.marca LIKE CONCAT('%','ARO1000','%') 
				OR (
					SELECT GROUP_CONCAT(DISTINCT g.id SEPARATOR ' / ') 
					FROM prod_grade AS g 
					WHERE p.id = g.fk_prod_id 
						AND (
							g.id LIKE CONCAT('%','ARO1000','%') 
							OR g.id LIKE CONCAT('%','ARO1000','%') 
							OR g.org_id LIKE CONCAT('%','ARO1000','%') 
							OR g.description LIKE CONCAT('%','ARO1000','%') 
					)
			)
		)



* Código com INNER JOIN
SELECT p.id, p.nome_prod, p.description, p.lnk, p.foto 
FROM produtos AS p
	INNER JOIN prod_grade AS g
WHERE p.id = g.fk_prod_id
	AND  (
		p.id LIKE CONCAT('%','ARO1000','%')
		OR(
			p.fk_grp = 2
			AND (
				OR g.id LIKE CONCAT('%','ARO1000','%')
				OR g.org_cod LIKE CONCAT('%','ARO1000','%')  
				OR g.description LIKE CONCAT('%','ARO1000','%') 
				OR p.org_cod LIKE CONCAT('%','ARO1000','%') 
				OR p.nome_prod LIKE CONCAT('%','ARO1000','%') 
				OR p.description LIKE CONCAT('%','ARO1000','%') 
				OR p.ctg LIKE CONCAT('%','ARO1000','%') 
				OR p.marca LIKE CONCAT('%','ARO1000','%') 
			    )
			)
		)


Fico no aguardo.

Grande abraço!
Edcp_poa

Edcp_poa

Responder

Posts

13/06/2016

Edcp_poa

* Correção do código com INNER jOIN:
SELECT DISTINCT p.id, p.nome_prod, p.description, p.lnk, p.foto 
FROM produtos AS p
	INNER JOIN prod_grade AS g
WHERE p.id = g.fk_prod_id
	AND  (
		p.id LIKE CONCAT('%','ARO1000','%')
		OR(
			p.fk_grp = 2
			AND (
				g.id LIKE CONCAT('%','ARO1000','%')
				OR g.org_cod LIKE CONCAT('%','ARO1000','%')  
				OR g.description LIKE CONCAT('%','ARO1000','%') 
				OR p.org_cod LIKE CONCAT('%','ARO1000','%') 
				OR p.nome_prod LIKE CONCAT('%','ARO1000','%') 
				OR p.description LIKE CONCAT('%','ARO1000','%') 
				OR p.ctg LIKE CONCAT('%','ARO1000','%') 
				OR p.marca LIKE CONCAT('%','ARO1000','%') 
			    )
			)
		)


Eu copiei o código errado da primeira vez. este código dá certo.
Responder

13/06/2016

Edcp_poa

ADENDO: ao utilizar a consulta com INNER JOIN, esta traz resultados inconsistentes. Por exemplo, ao buscar pela palavra chave 7246 (existente apenas no código da grade de um produto e código de um outro produto, retornaram 110 linhas, onde na maioria não há incidência destra string.
Responder

13/06/2016

Edcp_poa

Encontrei! O problema era realmente a sintaxe e talvez vocês já tenham encontrado qual, mas segue o código corrigido.
SELECT p.id, p.prod_nome, p.description, p.lnk, p.foto 
FROM produtos AS p
WHERE p.id LIKE CONCAT('%','7246','%') 
	OR (p.fk_grp_prod = 2
		AND (
				p.org_id LIKE CONCAT('%','7246','%') 
				OR p.prod_nome LIKE CONCAT('%','7246','%') 
				OR p.description LIKE CONCAT('%','7246','%') 
				OR p.categoria LIKE CONCAT('%','7246','%') 
				OR p.marca LIKE CONCAT('%','7246','%') 
				OR (
					SELECT GROUP_CONCAT(DISTINCT g.pk_grd SEPARATOR ' / ') 
					FROM prod_grade AS g 
					WHERE p.id = g.fk_prod_id 
						AND ( 
							OR g.id LIKE CONCAT('%','7246','%') 
							OR g.org_id LIKE CONCAT('%','7246','%') 
							OR g.description LIKE CONCAT('%','7246','%') 
							)
					)
			)
		)


Se alguém puder "iluminar" meu conhecimento e dar a conhecer porque a consulta com o INNER JOIN traz 110 registros, ao contrário de 2 registros (como deveria), agradeço.

Espero que esta consulta possa ajudar outros usuários do Fórum.

Grande abraço!
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar