/ consulta / mysql retornando a mesma linha várias vezes - mysql, sql

consulta mysql retornando a mesma linha várias vezes - mysql, sql

Eu estou tendo dificuldade em descobrir por queA consulta mysql está retornando a mesma linha cinco vezes. Aqui está a consulta abaixo. Eu li aqui algo sobre joins e produtos cartesianos. Eu sou muito novo para isso, e editando essa consulta no meu site que alguém criou inicialmente. Tentando entender as junções que são usadas aqui, mas isso está me confundindo. Qualquer ajuda é muito apreciada. O objetivo é fazer com que cada linha retorne apenas uma vez, não cinco vezes. Obrigado!

SELECT off . * , resp.tracking_date, resp.paid_date, resp.total_value, resp.total_conversion
FROM tbl_offers AS off, tbl_tracking AS tr, tbl_trackvalue AS resp, tbloffers_cat AS offcat
WHERE off.id = tr.offer_id
AND off.offer_type = "cash_offer"
AND off.id = offcat.offer_id
AND tr.id = resp.tracking_id
AND tr.user_id = "1454"
AND resp.total_value !=0
AND resp.payment_status = "paid"
LIMIT 0 , 30

Uau, obrigado por toda a ajuda a todos. Parece que muitas das soluções mencionadas aqui funcionariam. Eu obtive o resultado desejado adicionando um grupo por tracking_id à consulta. Não tenho certeza se isso é realmente a melhor maneira de fazer isso ou não. Eu apenas estou aprendendo a programar ao editar um site antigo, que eu inicialmente tinha alguém construindo. Muita diversão. A coisa toda da junção é uma das coisas mais complicadas com as quais já lidei até agora, mas tenho certeza de que ficará mais fácil.

Eu vou passar por essas respostas para escolher a melhor, embora pareça que várias podem funcionar, então eu não tenho certeza qual é o método padrão de escolha neste site. Obrigado novamente!

Respostas:

0 para resposta № 1

Não parece que o tbloffers_cat é usado na consulta e pode conter linhas que não são visíveis no seu conjunto de resultados. Para verificar isso, adicione tbloffers_cat.* à sua consulta e ver se os valores nesses campos diferem de linha para linha.

Se esse for o caso, tente o seguinte:

SELECT off.*
, resp.tracking_date
, resp.paid_date
, resp.total_value
, resp.total_conversion
FROM tbl_offers AS off
INNER JOIN tbl_tracking AS tr ON tr.offer_id = off.id
INNER JOIN tbl_trackvalue AS resp ON resp.tracking_id = tr.id
WHERE off.offer_type = "cash_offer"
AND tr.user_id = "1454"
AND resp.total_value !=0
AND resp.payment_status = "paid"
LIMIT 0 , 30

Na minha opinião, a sintaxe de junções internas é geralmente mais clara quando se olha para a consulta.


2 para resposta № 2

Embora a sua consulta deva funcionar como pretendido, está a utilizar uma sintaxe descontinuada, sugiro substituir as associações implícitas reprovadas por junções explícitas padrão:

SELECT off. * , resp.tracking_date, resp.paid_date, resp.total_value, resp.total_conversion
FROM tbl_offers AS off
JOIN tbl_tracking AS tr
ON off.id = tr.offer_id
JOIN tbl_trackvalue AS resp
ON tr.id = resp.tracking_id
JOIN tbloffers_cat AS offcat
ON off.id = offcat.offer_id
WHERE off.offer_type = "cash_offer"
AND tr.user_id = "1454"
AND resp.total_value !=0
AND resp.payment_status = "paid"
LIMIT 0 , 30

Quanto aos múltiplos registros, se o JOIN critérios não identificam um para umEm seguida, você obterá várias linhas onde esperava 1. Tente selecionar os campos de todas as tabelas da consulta para ver qual tabela tem vários valores retornados. Talvez haja vários registros de rastreamento com o mesmo offer_id, mas você não verá na sua consulta porque você não está selecionando nada da tabela de rastreamento.


0 para resposta № 3

Você tem um produto cartesiano na sua consulta.

Você deve se juntar a tbl_offers e todas as outras tabelas como esta

FROM tbl_offers um JOIN tbl_tracking u ON a.id = u.offer_id

Então tente assim

SELECT off. * , resp.tracking_date, resp.paid_date, resp.total_value, resp.total_conversion
FROM tbl_offers AS off
JOIN tbl_tracking AS tr
ON off.id = tr.offer_id
JOIN tbl_trackvalue AS resp
ON tr.id = resp.tracking_id
JOIN tbloffers_cat AS offcat
ON off.id = offcat.offer_id
WHERE off.offer_type = "cash_offer"
AND tr.user_id = "1454"
AND resp.total_value !=0
AND resp.payment_status = "paid"
LIMIT 0 , 30

Leia mais sobre como unir tabelas aqui: http://dev.mysql.com/doc/refman/5.5/en/join.html


0 para a resposta № 4

SQL JOINS

O Codeproject tem essa imagem que explica os fundamentos simples de junções SQL, tiradas de:

Representação Visual de Junções SQL

insira a descrição da imagem aqui

atualize sua consulta como segue aqui

SELECT off.*,resp.tracking_date, resp.paid_date, resp.total_value, resp.total_conversion
FROM tbl_offers AS off
LEFT JOIN  tbl_tracking AS tr ON tr.offer_id = off.id
LEFT JOIN  tbl_trackvalue AS resp ON  resp.tracking_id = tr.id
LEFT JOIN  tbloffers_cat AS offcat ON offcat.offer_id = off.id
WHERE  off.offer_type = "cash_offer"
AND tr.user_id = "1454"
AND resp.total_value != 0
AND resp.payment_status = "paid"
LIMIT 0 , 30

espero que isso resolva seu problema