/ / mysql zapytanie zwracające ten sam wiersz wiele razy - mysql, sql

zapytanie mysql zwracające wielokrotnie ten sam wiersz - mysql, sql

Trudno mi zrozumieć, dlaczegoKwerenda mysql zwraca ten sam wiersz pięć razy. Oto zapytanie poniżej. Przeczytałem tutaj coś o połączeniach i produktach kartizyjskich. Jestem bardzo nowy i edytuję to zapytanie w mojej witrynie, które ktoś pierwotnie utworzył. Próbuję zrozumieć połączenia, które są tutaj używane, ale to mnie dezorientuje. Każda pomoc jest mile widziana. Celem jest, aby każdy wiersz powrócił tylko raz, a nie pięć razy. Dzięki!

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

Wow, dzięki za wszelką pomoc wszystkim. Wygląda na to, że wiele wymienionych tu rozwiązań zadziałałoby. Otrzymałem pożądany wynik, dodając grupę przez tracking_id do zapytania. Nie jestem pewien, czy to rzeczywiście najlepszy sposób, aby to zrobić, czy nie. Uczę się programować podczas edytowania starej witryny, którą wcześniej zbudowałem. Dużo zabawy. Cała łączenie jest jedną z bardziej skomplikowanych rzeczy, z którymi do tej pory się zmagałem, ale jestem pewien, że będzie łatwiej.

Przejdę przez te odpowiedzi, aby wybrać najlepszą, chociaż wygląda na to, że wiele może działać, więc nie jestem pewien, jaka jest standardowa metoda wybierania w tej witrynie. Dzięki jeszcze raz!

Odpowiedzi:

0 dla odpowiedzi № 1

Nie wygląda na to, że w zapytaniu użyto tbloffers_cat i może zawierać wiersze, które nie są widoczne w zestawie wyników. Aby to zweryfikować, dodaj tbloffers_cat.* do zapytania i sprawdź, czy wartości w tych polach różnią się między wierszami.

Jeśli tak jest, spróbuj tego:

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

Moim zdaniem składnia sprzężeń wewnętrznych jest zwykle jaśniejsza, gdy patrzy się na zapytanie.


2 dla odpowiedzi nr 2

Chociaż twoje zapytanie powinno działać zgodnie z przeznaczeniem, używa przestarzałej składni, sugeruję zastąpienie przestarzałych sprzężeń niejawnych standardowymi sprzężeniami jawnymi:

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

Co do wielu rekordów, jeśli JOIN kryteria nie identyfikują jeden do jednegoWówczas otrzymasz wiele wierszy tam, gdzie się spodziewałeś 1. Spróbuj wybrać pola ze wszystkich tabel w zapytaniu, aby zobaczyć, która tabela ma zwracane wiele wartości. Być może istnieje wiele rekordów śledzenia o tym samym identyfikatorze oferty, ale nie zobaczysz tego w zapytaniu, ponieważ nie wybierasz niczego z tabeli śledzenia.


0 dla odpowiedzi № 3

Masz produkt kartezjański w zapytaniu.

Powinieneś DOŁĄCZYĆ do tbl_offers i wszystkich innych podobnych tabel

Z tbl_offs a JOIN tbl_tracking u ON a.id = u.offer_id

Więc spróbuj tak

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

Przeczytaj więcej na temat łączenia tabel tutaj: http://dev.mysql.com/doc/refman/5.5/en/join.html


0 dla odpowiedzi nr 4

ŁĄCZENIA SQL

Codeproject ma ten obraz, który wyjaśnia proste podstawy sprzężeń SQL, zaczerpnięty z:

Wizualna reprezentacja połączeń SQL

wprowadź opis obrazu tutaj

zaktualizuj zapytanie w następujący sposób tutaj

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

mam nadzieję, że to rozwiąże twój problem