Problema com consulta SQL Composta (MySQL)

MySQL

PostgreSQL

13/06/2016

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

Curtidas 0

Respostas

Edcp_poa

Edcp_poa

13/06/2016

* 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.
GOSTEI 0
Edcp_poa

Edcp_poa

13/06/2016

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.
GOSTEI 0
Edcp_poa

Edcp_poa

13/06/2016

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!
GOSTEI 0
POSTAR