/ / mysql query che restituisce la stessa riga più volte - mysql, sql

query mysql che restituisce la stessa riga più volte: mysql, sql

Sto attraversando un momento difficile capire perchéLa query mysql restituisce la stessa riga cinque volte. Ecco la query qui sotto. Ho letto qui qualcosa su join e prodotti cartisiani. Sono molto nuovo e sto modificando questa query sul mio sito che qualcun altro inizialmente ha creato. Cercare di capire i join che vengono utilizzati qui, ma mi confonde. Qualsiasi aiuto è molto apprezzato. L'obiettivo è far tornare ogni riga una sola volta, non cinque volte. Grazie!

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, grazie per tutto l'aiuto a tutti. Sembra che molte delle soluzioni menzionate qui funzionerebbero. Ho ottenuto il risultato desiderato aggiungendo un gruppo tracking_id alla query. Non sono sicuro che sia effettivamente il modo migliore per farlo o no. Sto solo imparando a programmare durante la modifica di un vecchio sito, che inizialmente avevo creato da qualcun altro. Molto divertente. Tutto ciò che riguarda l'unione è una delle cose più complicate che ho affrontato finora, ma sono sicuro che diventerà più facile.

Esaminerò queste risposte per scegliere la migliore, anche se sembra che il multiplo possa funzionare, quindi non sono sicuro di quale sia il metodo standard di raccolta su questo sito. Grazie ancora!

risposte:

0 per risposta № 1

Non sembra che tbloffers_cat sia usato nella query e può contenere righe che non sono visibili nel set di risultati. Per verificarlo, aggiungi tbloffers_cat.* alla tua query e verifica se i valori in tali campi differiscono da riga a riga.

In tal caso, prova questo:

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

A mio avviso, la sintassi dei join interni è in genere più chiara quando si esamina la query.


2 per risposta № 2

Mentre la query dovrebbe funzionare come previsto, utilizza una sintassi obsoleta, suggerisco di sostituire i join impliciti obsoleti con i join espliciti standard:

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

Per quanto riguarda i record multipli, se il JOIN i criteri non identificano uno a unopoi otterrai più righe dove ti aspettavi 1. Prova a selezionare i campi da tutte le tabelle nella tua query per vedere quale tabella ha più valori restituiti. Forse ci sono più record di tracciamento con lo stesso offer_id, ma non vedresti che nella tua query perché non stai selezionando nulla dalla tabella di monitoraggio.


0 per risposta № 3

Hai un prodotto cartesiano nella tua domanda.

È necessario ISCRIVERSI a tbl_offers e a tutte le altre tabelle come questa

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

Quindi prova così

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

Maggiori informazioni sull'unione delle tabelle qui: http://dev.mysql.com/doc/refman/5.5/en/join.html


0 per risposta № 4

JOIN SQL

Codeproject ha questa immagine che spiega le semplici basi dei join SQL, prese da:

Rappresentazione visiva di join SQL

inserisci la descrizione dell'immagine qui

aggiorna la tua query come segue qui

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

spero che questo risolva il tuo problema