Ir para conteúdo

Arquivado

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

maurolucio

Não consigo realizara esta consulta

Recommended Posts

Boa tarde a todos.

 

Possuo duas tabelas conforme abaixo:

 

TABELA: gc_prdts_qnt_info

--
-- Estrutura da tabela `gc_prdts_qnt_info`
--

CREATE TABLE IF NOT EXISTS `gc_prdts_qnt_info` (
  `PQI_IdPrdtsQnt` int(10) NOT NULL DEFAULT '0',
  `PQI_IdInfo` int(10) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Extraindo dados da tabela `gc_prdts_qnt_info`
--

INSERT INTO `gc_prdts_qnt_info` (`PQI_IdPrdtsQnt`, `PQI_IdInfo`) VALUES
(1, 290),
(2, 291),
(3, 292),
(4, 290),
(5, 291),
(6, 292),
(7, 290),
(8, 291),
(9, 292),
(10, 290),
(11, 291),
(12, 292),
(1, 261),
(2, 261),
(3, 261),
(4, 274),
(5, 274),
(6, 274),
(7, 275),
(8, 275),
(9, 275),
(10, 276),
(11, 276),
(12, 276);

 

 

TABELA: gc_prdts_qnt

 

--
-- Estrutura da tabela `gc_prdts_qnt`
--

CREATE TABLE IF NOT EXISTS `gc_prdts_qnt` (
  `PQ_IdPrdtsQnt` int(10) NOT NULL AUTO_INCREMENT,
  `PQ_IdPrdts` int(10) NOT NULL DEFAULT '0',
  `PQ_Qnt` int(5) NOT NULL DEFAULT '0',
  `PQ_QntMaxCart` int(5) NOT NULL DEFAULT '0',
  `PQ_QntMinEstq` int(5) NOT NULL DEFAULT '0',
  `PQ_Preco` decimal(10,2) NOT NULL DEFAULT '0.00',
  `PQ_PrecoSts` char(3) NOT NULL DEFAULT 'Nao',
  PRIMARY KEY (`PQ_IdPrdtsQnt`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;

--
-- Extraindo dados da tabela `gc_prdts_qnt`
--

INSERT INTO `gc_prdts_qnt` (`PQ_IdPrdtsQnt`, `PQ_IdPrdts`, `PQ_Qnt`, `PQ_QntMaxCart`, `PQ_QntMinEstq`, `PQ_Preco`, `PQ_PrecoSts`) VALUES
(1, 621, 3, 3, 2, '0.00', 'Nao'),
(2, 621, 5, 4, 2, '0.00', 'Nao'),
(3, 621, 11, 10, 5, '0.00', 'Nao'),
(4, 621, 10, 5, 3, '0.00', 'Nao'),
(5, 621, 15, 10, 5, '0.00', 'Nao'),
(6, 621, 20, 12, 6, '0.00', 'Nao'),
(7, 621, 8, 5, 6, '0.00', 'Nao'),
(8, 621, 16, 10, 5, '0.00', 'Nao'),
(9, 621, 28, 13, 6, '0.00', 'Nao'),
(10, 621, 30, 20, 8, '35.00', 'Sim'),
(11, 621, 35, 26, 5, '42.69', 'Sim'),
(12, 621, 40, 30, 10, '70.25', 'Sim'),
(13, 744, 14, 10, 6, '0.00', 'Nao'),
(14, 641, 26, 15, 6, '0.00', 'Nao');

 

Para estas tabelas preciso fazer uma consulta seguindo alguns parâmetros e tentei o sql abaixo:

SELECT 
gc_prdts_qnt_info.PQI_IdInfo,
gc_prdts_qnt.PQ_IdPrdtsQnt, gc_prdts_qnt.PQ_IdPrdts, gc_prdts_qnt.PQ_Preco, gc_prdts_qnt.PQ_PrecoSts, gc_prdts_qnt.PQ_Qnt AS Qnt, gc_prdts_qnt.PQ_QntMaxCart AS QntMaxCart
FROM gc_prdts_qnt_info
RIGHT JOIN gc_prdts_qnt ON gc_prdts_qnt.PQ_IdPrdtsQnt = gc_prdts_qnt_info.PQI_IdPrdtsQnt
WHERE gc_prdts_qnt.PQ_IdPrdts = '621'
AND gc_prdts_qnt_info.PQI_IdInfo IN('276','292')

Porém estou recebendo uma resposta que levou em consideração a condição "OR"

 

A minha necessidade é que se retorne um resultado onde (gc_prdts_qnt.PQ_IdPrdts = '621' e gc_prdts_qnt_info.PQI_IdInfo = '276') e (gc_prdts_qnt.PQ_IdPrdts = '621' e gc_prdts_qnt_info.PQI_IdInfo = '292')

 

a minha resposta ideal seriam dois registros, ambos com o PQI_IdPrdtsQnt = '12'

 

tentei também a consulta abaixo:

SELECT 
gc_prdts_qnt_info.PQI_IdInfo,
gc_prdts_qnt.PQ_IdPrdtsQnt, gc_prdts_qnt.PQ_IdPrdts, gc_prdts_qnt.PQ_Preco, gc_prdts_qnt.PQ_PrecoSts, gc_prdts_qnt.PQ_Qnt AS Qnt, gc_prdts_qnt.PQ_QntMaxCart AS QntMaxCart
FROM gc_prdts_qnt_info
LEFT JOIN gc_prdts_qnt ON gc_prdts_qnt.PQ_IdPrdtsQnt = gc_prdts_qnt_info.PQI_IdPrdtsQnt

WHERE gc_prdts_qnt_info.PQI_IdInfo in (SELECT gc_prdts_qnt_info.PQI_IdInfo FROM gc_prdts_qnt_info INNER JOIN gc_prdts_qnt ON gc_prdts_qnt.PQ_IdPrdtsQnt = gc_prdts_qnt_info.PQI_IdPrdtsQnt Where gc_prdts_qnt.PQ_IdPrdts = '621' AND gc_prdts_qnt_info.PQI_IdInfo = '292')
OR gc_prdts_qnt_info.PQI_IdInfo in (SELECT gc_prdts_qnt_info.PQI_IdInfo FROM gc_prdts_qnt_info INNER JOIN gc_prdts_qnt ON gc_prdts_qnt.PQ_IdPrdtsQnt = gc_prdts_qnt_info.PQI_IdPrdtsQnt Where gc_prdts_qnt.PQ_IdPrdts = '621' AND gc_prdts_qnt_info.PQI_IdInfo = '276')

para todas as consultas o retorno não é o que eu necessito, alguém teria alguma ideia de como realizar esta consulta?

 

Obrigado

 

Mauro Lúcio

Compartilhar este post


Link para o post
Compartilhar em outros sites

Buenas tchê.

 

Você precisa retornar todas as colunas? Se sim, a lógica que você está procurando não vai funcionar.

Como você espera retornar apenas 2 linhas quando há muitos registros no banco?

Um select busca os resultados analisando linha a linha do banco. Se a linha toda, atender aos critérios ela será retornada.

Na sua segunda consulta, você tem os campos PQ_IdPrdtsQnt, PQ_Preco, PQ_PrecoSts, PQ_Qnt, PQ_QntMaxCart que possuem informações diferentes, logo todos os registros serão exibidos, mesmo usando um distinct na consulta.

 

Uma maneira de "resolver", seria aplicando um sum() nos registros de valores.

SELECT distinct
gc_prdts_qnt_info.PQI_IdInfo,
sum(gc_prdts_qnt.PQ_IdPrdtsQnt), gc_prdts_qnt.PQ_IdPrdts, sum(gc_prdts_qnt.PQ_Preco), gc_prdts_qnt.PQ_PrecoSts, sum(gc_prdts_qnt.PQ_Qnt) AS Qnt, sum(gc_prdts_qnt.PQ_QntMaxCart) AS QntMaxCart
FROM gc_prdts_qnt_info
LEFT JOIN gc_prdts_qnt ON gc_prdts_qnt.PQ_IdPrdtsQnt = gc_prdts_qnt_info.PQI_IdPrdtsQnt

WHERE gc_prdts_qnt_info.PQI_IdInfo in (SELECT gc_prdts_qnt_info.PQI_IdInfo FROM gc_prdts_qnt_info INNER JOIN gc_prdts_qnt ON gc_prdts_qnt.PQ_IdPrdtsQnt = gc_prdts_qnt_info.PQI_IdPrdtsQnt Where gc_prdts_qnt.PQ_IdPrdts = '621' AND gc_prdts_qnt_info.PQI_IdInfo = '292')
OR gc_prdts_qnt_info.PQI_IdInfo in (SELECT gc_prdts_qnt_info.PQI_IdInfo FROM gc_prdts_qnt_info INNER JOIN gc_prdts_qnt ON gc_prdts_qnt.PQ_IdPrdtsQnt = gc_prdts_qnt_info.PQI_IdPrdtsQnt Where gc_prdts_qnt.PQ_IdPrdts = '621' AND gc_prdts_qnt_info.PQI_IdInfo = '276')

GROUP BY
gc_prdts_qnt_info.PQI_IdInfo,gc_prdts_qnt.PQ_IdPrdts,gc_prdts_qnt.PQ_PrecoSts

Aqui o problema é só o campo gc_prdts_qnt.PQ_PrecoSts que, por possuir 2 valores, vai duplicar a linha do id.

A mesma "solução" utilizando sum() pode ser aplicada no seu primeiro SQL.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, deixa eu explicar a situação:

 

A tabela gc_prdts_qnt é onde eu defino a quantidade de meus produtos, porém esta quantidade é definida pela combinação de cor e tamanho que é feita na tabela gc_prdts_qnt_info.

 

Desta forma o produto com id 621 (PQ_IdPrdts=621) que na tabela de quantidades (gc_prdts_qnt), no (PQ_IdPrdtsQnt = 12) , possui 40 unidades. Isto associando às informações de tamanho e cor na tabela gc_prdts_qnt_info, como na linha abixo:

(`PQ_IdPrdtsQnt`, `PQ_IdPrdts`, `PQ_Qnt`, `PQ_QntMaxCart`, `PQ_QntMinEstq`, `PQ_Preco`, `PQ_PrecoSts`)

(12, 621, 40, 30, 10, '70.25', 'Sim')

 

Isso acontesse associando o id da tabela de quantidades que já contem o id do produto PQI_IdPrdtsQnt e os ids de tamanho e cor PQI_IdInfo.

 

Ficando assim:

(`PQI_IdPrdtsQnt`, `PQI_IdInfo`)

(12, 292)

(12, 276)

 

Resumindo: Preciso realizar uma busca que no produto: 621, com tamanho: 292 e cor: 276 eu consiga encontrar a quantidade 40 localizada no registro de id 12 da tabela gc_prdts_qnt

Compartilhar este post


Link para o post
Compartilhar em outros sites

Testei uma solução anterior encontrada aqui neste fórum e não vou conseguir dar os créditos corretos, pois não encontrei o post para achar o autor da solução, porém me trouxe o resultado esperado.

SELECT 
gc_prdts_qnt_info.PQI_IdInfo,
gc_prdts_qnt.PQ_IdPrdtsQnt, gc_prdts_qnt.PQ_IdPrdts, gc_prdts_qnt.PQ_Preco, gc_prdts_qnt.PQ_PrecoSts, gc_prdts_qnt.PQ_Qnt AS Qnt, gc_prdts_qnt.PQ_QntMaxCart AS QntMaxCart
FROM gc_prdts_qnt_info
left JOIN gc_prdts_qnt ON gc_prdts_qnt.PQ_IdPrdtsQnt = gc_prdts_qnt_info.PQI_IdPrdtsQnt

WHERE gc_prdts_qnt.PQ_IdPrdtsQnt in (SELECT 
gc_prdts_qnt_info.PQI_IdPrdtsQnt
FROM gc_prdts_qnt_info
LEFT JOIN gc_prdts_qnt ON gc_prdts_qnt.PQ_IdPrdtsQnt = gc_prdts_qnt_info.PQI_IdPrdtsQnt
WHERE gc_prdts_qnt.PQ_IdPrdts = '621'
AND gc_prdts_qnt_info.PQI_IdInfo = '276')

AND gc_prdts_qnt.PQ_IdPrdtsQnt in (SELECT 
gc_prdts_qnt_info.PQI_IdPrdtsQnt
FROM gc_prdts_qnt_info
LEFT JOIN gc_prdts_qnt ON gc_prdts_qnt.PQ_IdPrdtsQnt = gc_prdts_qnt_info.PQI_IdPrdtsQnt
WHERE gc_prdts_qnt.PQ_IdPrdts = '621'
AND gc_prdts_qnt_info.PQI_IdInfo = '292')

Apesar de me retornar o que eu preciso, daria par aalguém analisar esse sql e dizer se ele está bem construído?

 

Abraço a todos

 

Mauaro Lúcio

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.