簡體   English   中英

mysql查詢多次返回同一行

[英]mysql query returning the same row multiple times

我很難弄清楚為什么我的mysql查詢會五次返回同一行。 這是下面的查詢。 我在這里閱讀了有關聯接和笛卡爾積的一些信息。 我對此很陌生,正在其他人最初創建的網站上編輯此查詢。 試圖了解這里使用的聯接,但這使我感到困惑。 任何幫助是極大的贊賞。 目標是使每一行僅返回一次,而不是五次。 謝謝!

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

哇,謝謝大家的幫助。 看起來這里提到的許多解決方案都可以使用。 我確實通過在tracking_id中添加了一個組來獲得想要的結果。 不知道這是否真的是最好的方法。 我只是在編輯舊網站時學習編程,而我最初是由其他人構建的。 超有趣。 到目前為止,整個聯接是我處理過的更復雜的事情之一,但是我敢肯定,它將變得更加容易。

我將仔細研究這些答案以選擇最佳答案,盡管看起來多個答案可行,所以我不確定該站點上的標准選擇方法是什么。 再次感謝!

雖然查詢應該可以正常工作,但它使用的是不贊成使用的語法,但我建議將不贊成使用的隱式聯接替換為標准的顯式聯接:

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

對於多條記錄,如果JOIN條件不能識別一對一關系,那么您將在期望的位置得到多行。1.嘗試從查詢的所有表中選擇字段,以查看哪個表返回了多個值。 也許有多個具有相同offer_id的跟蹤記錄,但是您不會在查詢中看到該記錄,因為您沒有從跟蹤表中選擇任何內容。

您的查詢中有一個笛卡爾積

您應該加入tbl_offers和其他所有這樣的表

FROM tbl_offers加入JOIN tbl_tracking u在a.id = u.offer_id上

所以嘗試這樣

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

在此處閱讀有關聯接表的更多信息: http : //dev.mysql.com/doc/refman/5.5/en/join.html

SQL聯接

Codeproject的圖像說明了SQL連接的簡單基礎,該圖像取自:

SQL聯接的可視表示

在此處輸入圖片說明

如下更新您的查詢

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

希望這能解決您的問題

它看起來不像在查詢中使用了tbloffers_cat,並且可能包含在結果集中不可見的行。 要驗證這一點,請將tbloffers_cat.*添加到查詢中,並查看這些字段中的值是否逐行不同。

如果是這種情況,請嘗試以下操作:

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

我認為,在查看查詢時,內部聯接的語法通常更清晰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM