Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá Amigos, estou com um probleminha pra resolver aqui.
Antes de postar o código vou explicar a situação,meu sistema funciona da seguinte forma:
proceeding guarda vários documents, e cada proceeding pertence a um client. preciso imprimir em uma lista todos os proceedings.
Estou cruzando 3 tabelas (proceeding,documents,clients), acontece que eu quero listar apenas o conteudo da tabela proceeding e ao imprimir relacionar as informações das outras tabelas a cada procedimento.
O que está acontecendo é que minha query tá retornando resultados repetidos, não entendi muito a lógica de cruzar tabelas, então me esbarrei nessa dificuldade.
Segue o código:
$archiveQ = mysql_query(
"SELECT pr.proceeding,pr.proceedingId,d.docId, d.docFile, d.docDate, c.nome FROM proceeding pr
INNER JOIN documents d
INNER JOIN clients c ORDER BY pr.proceedingId DESC");
Se puderem me ajudar agradeço MUITO, tenho pouco tempo para corrigir isso em um sistema que desenvolvi.
Grato,
Dênis Fernandes
As vezes por forças "místicas" de um determinado SGBD... isso ocorre...
Normalmente quando o relacionamente é 1:N ou N:M (N:1 não... você já pegaria todos os dados) e você quer apenas um dado em específico, como o nome.
Se a solução do Henrique Barcelos não funcionar, adicione um DISTINCT no seu Select.
"SELECT DISTINCT pr.`proceeding`,pr.`proceedingId`,..."
Não sei com certeza, mas ouvi falar que um DISTINCT se torna pesado para alguns casos. Pois primeiro ele busca TUDO e depois filtra.
Se você quer somente o nome do cliente, não seria melhor um sub-select?
Sim, só que dentro da sua atual query.
Suponha que você tenha uma tabela de clientes (tabela 'cliente') e uma tabela de produtos (produto) e outra de produtos vendidos (produto_vendido). Farei um exemplo rápido, senão vou me estender muuuuuuito em gráficos e tabelas.
A tabela produto_vendido mantem um código do produto e um código do cliente que comprou.
Nem todos os clientes compraram um produto, mas todos os produtos foram vendidos para um cliente (óbvio).
Agora você quer retornar somente os clientes que compraram.
Para o nosso exemplo, a tabela de produtos (produto) é irrelevante. Você quer apenas saber quais clientes compraram alguma coisa e não o que compraram.
Vamos a estrutura básica da tabela:
cliente:
id | nome
produto_vendido:
id_produto | id_cliente
Vamos ao SQL:
SELECT
id,
nome
FROM
cliente
WHERE
id IN ( SELECT id_cliente FROM produto_vendido )
Esse é uma subquery bem básica. Irá retornar todos os clientes que o id ESTEJA (IN) na tabela produto_vendido.
Caso você queira xingar os clientes que não compraram. Basta inserir o NOT em frente ao IN, que irá retornar os clientes que não fizeram compra alguma. Segue:
SELECT
id,
nome
FROM
cliente
WHERE
id NOT IN ( SELECT id_cliente FROM produto_vendido )
Claro que você não vai xingar. Mas talvez possa querer saber o porque que eles estão no seus sistema e não compraram nada...
Isso é apenas 1% do que pode ser feito com subquery. Mas já é o início de um estudo.
Faltou a cláusula 'ON' aí...
ON campo_tabela1 = campo_tabela2