2011-12-20 149 views
-2

我有一個SQL語句如下:LEFT JOIN和重複的結果

SELECT s.sp_id,s.synopsis,s.logline,s.user_id,s.bin_status,s.sp_order,s.sp_down_count,s.sp_name, 
      `users`.firstname as `firstname`,`users`.lastname as `lastname`,s.status, 
      `users`.email as `email`,`users`.phone as `phone`,`users`.address1 as `address1`, 
      `users`.address2 as `address2`,`users`.`r_group`, view_coverages.grade,coverages.comments 

    FROM s 
    LEFT JOIN `users` ON `users`.user_id=s.user_id 
    LEFT JOIN view_coverages ON view_coverages.sp_id=s.sp_id 
    LEFT JOIN `coverages` ON `coverages`.sp_id=s.sp_id 

    WHERE $email_filter lower(s.synopsis) like '%$search_word_fix%' 
    OR lower(s.sp_name) like '%$search_word_fix%' 
    OR lower(s.logline) like '%$search_word_fix%' 
    OR lower(coverages.comments) like '% $search_word_fix %' 
    ORDER BY view_coverages.grade DESC 

當我顯示結果我得到了很多重複的。 我想顯示s.sp_name不重複的搜索結果。

+0

你變得越來越重複你的結果,因爲地方你有沒有獨特的連接數據。爲了找到(所以這可以糾正),我們需要一些樣本數據和結果,並可能是你想要完成的... – 2011-12-20 00:12:26

回答

2

你有兩個選擇:

  1. 只選擇唯一的,不重複的,通過改變你的SELECTSELECT DISTINCT結果。
  2. GROUP BY s.sp_name但您需要在所有您選擇的其他字段上執行聚合函數。

由於我確定您無法對某人的姓名,地址,電話號碼等進行平均或累計,您應該嘗試選項1(SELECT DISTINCT)。如果您在其他重複行中有非唯一字段,則除了唯一字段外,您需要每個字段GROUP BY;在剩餘的唯一字段上使用集合函數(即,SUMAVG等)。

+0

我使用了選擇DISTINCT它仍然顯示重複項 – cppit 2011-12-20 00:15:34

+0

你的意思是沒有任何改變或零行返回?如果沒有改變,那麼重複行中的哪些字段不會被複制? – 2011-12-20 00:16:51

+0

沒有它仍然顯示重複。 SELECT DISTINCT s.sp_id,s.synopsis,s.logline,s.user_id,s.bin_status,s.sp_order,s.sp_down_count,s.sp_name等... – cppit 2011-12-20 00:19:12

1

泰這樣的:

SELECT s.sp_id,s.synopsis,s.logline,s.user_id,s.bin_status,s.sp_order,s.sp_down_count,s.sp_name, 
      `users`.firstname as `firstname`,`users`.lastname as `lastname`,s.status, 
      `users`.email as `email`,`users`.phone as `phone`,`users`.address1 as `address1`, 
      `users`.address2 as `address2`,`users`.`r_group`, view_coverages.grade,coverages.comments 

    FROM s 
    LEFT JOIN `users` ON `users`.user_id=s.user_id 
    LEFT JOIN view_coverages ON view_coverages.sp_id=s.sp_id 
    LEFT JOIN `coverages` ON `coverages`.sp_id=s.sp_id 

    WHERE $email_filter lower(s.synopsis) like '%$search_word_fix%' 
    OR lower(s.sp_name) like '%$search_word_fix%' 
    OR lower(s.logline) like '%$search_word_fix%' 
    OR lower(coverages.comments) like '% $search_word_fix %' 
    ADD --->  group by s.sp_name 
    ORDER BY view_coverages.grade DESC