2011-12-13 15 views
0

這裏是我的示例SQL代碼正在獲取重複的數據行,如何解決這個問題?

SELECT * FROM wsrecruitcvhead AS CV, wsrecruittimes AS WT 
WHERE 
CV.`ResumeTitle` LIKE '%search%' 
OR ResumeSummaryIntroduction LIKE '%search%' 
OR WT.`AvailableToWorkSunday` = 0 
OR WT.`AvailableToWorkMonday` = 0 
OR WT.`AvailableToWorkTuesday` = 0 
OR WT.`AvailableToWorkWednesday` = 0 
OR WT.`AvailableToWorkThursday` = 0 
OR WT.`AvailableToWorkFriday` = 0 
AND CV.`ResumeID` = WT.`ResumeID` 
ORDER BY CV.ResumeID ASC; 

時獲取數據的重複行......它並沒有幫助,當我試圖SELECT DISTINCT *,做什麼用呢?,如何解決呢?

+0

您在OR和AND之間混合使用時,應在適用時加上括號。 – ajreal

回答

1

您查詢等效於:

SELECT * 
    FROM wsrecruitcvhead AS CV, wsrecruittimes AS WT 
WHERE CV.`ResumeTitle` LIKE '%search%' 
    OR ResumeSummaryIntroduction LIKE '%search%' 
    OR WT.`AvailableToWorkSunday` = 0 
    OR WT.`AvailableToWorkMonday` = 0 
    OR WT.`AvailableToWorkTuesday` = 0 
    OR WT.`AvailableToWorkWednesday` = 0 
    OR WT.`AvailableToWorkThursday` = 0 
    OR (WT.`AvailableToWorkFriday` = 0 
     AND CV.`ResumeID` = WT.`ResumeID`) 
ORDER BY CV.ResumeID ASC; 

這意味着兩個表格之間沒有很好的連接。瞭解如何使用顯式連接符號來保存自己這個悲痛:

SELECT * 
    FROM wsrecruitcvhead AS CV 
    JOIN wsrecruittimes AS WT 
    ON CV.`ResumeID` = WT.`ResumeID` 
WHERE CV.`ResumeTitle` LIKE '%search%' 
    OR ResumeSummaryIntroduction LIKE '%search%' 
    OR WT.`AvailableToWorkSunday` = 0 
    OR WT.`AvailableToWorkMonday` = 0 
    OR WT.`AvailableToWorkTuesday` = 0 
    OR WT.`AvailableToWorkWednesday` = 0 
    OR WT.`AvailableToWorkThursday` = 0 
    OR WT.`AvailableToWorkFriday` = 0 
ORDER BY CV.ResumeID ASC; 

然而,儘管這是你查詢的簡單和直接的修改,你可能想到的:

SELECT * 
    FROM wsrecruitcvhead AS CV 
    JOIN wsrecruittimes AS WT 
    ON CV.`ResumeID` = WT.`ResumeID` 
WHERE (CV.`ResumeTitle` LIKE '%search%' 
     OR ResumeSummaryIntroduction LIKE '%search%' 
     ) 
    AND ( WT.`AvailableToWorkSunday` = 0 
     OR WT.`AvailableToWorkMonday` = 0 
     OR WT.`AvailableToWorkTuesday` = 0 
     OR WT.`AvailableToWorkWednesday` = 0 
     OR WT.`AvailableToWorkThursday` = 0 
     OR WT.`AvailableToWorkFriday` = 0 
     ) 
ORDER BY CV.ResumeID ASC; 

甚至(因爲沒有明顯的理由省略星期六):

SELECT * 
    FROM wsrecruitcvhead AS CV 
    JOIN wsrecruittimes AS WT 
    ON CV.`ResumeID` = WT.`ResumeID` 
WHERE (CV.`ResumeTitle` LIKE '%search%' 
     OR ResumeSummaryIntroduction LIKE '%search%' 
     ) 
    AND ( WT.`AvailableToWorkSunday` = 0 
     OR WT.`AvailableToWorkMonday` = 0 
     OR WT.`AvailableToWorkTuesday` = 0 
     OR WT.`AvailableToWorkWednesday` = 0 
     OR WT.`AvailableToWorkThursday` = 0 
     OR WT.`AvailableToWorkFriday` = 0 
     OR WT.`AvailableToWorkSaturday` = 0 
     ) 
ORDER BY CV.ResumeID ASC; 
+0

用「OR」替換「AND」是否合法?因爲已經有一個括號將它們分開? – sasori

+0

在最後兩個查詢中?是的,這是合法的;它從根本上改變了查詢,但。使用AND時,您正在查找與'%search%'位相匹配的簡歷,並且該人無法在一週中的某一天工作。如果您使用OR而不是AND,那麼您要麼尋找履歷與搜索相匹配的人,要麼尋找無法在一週中某天工作的人。實際上,查詢的一週中的某一天對我的思維方式有點懷疑 - 但你知道你在尋找什麼比我更好。 –

0

DISTINCT只有在行完全重複時纔有效。嘗試更具選擇性的SELECT,因此,而不是使用*,選擇您需要的實際列。

也看看GROUP BYhttp://dev.mysql.com/doc/refman/5.0/en/group-by-modifiers.html

此查詢比你的更好一點,並使其更易於使用:

SELECT * 
     FROM wsrecruitcvhead AS CV 
INNER JOIN wsrecruittimes AS WT ON (CV.`ResumeID` = WT.`ResumeID`) 
    WHERE ( CV.`ResumeTitle` LIKE '%search%' 
      OR ResumeSummaryIntroduction LIKE '%search%' 
      ) 
     AND ( WT.`AvailableToWorkSunday` = 0 
      OR WT.`AvailableToWorkMonday` = 0 
      OR WT.`AvailableToWorkTuesday` = 0 
      OR WT.`AvailableToWorkWednesday` = 0 
      OR WT.`AvailableToWorkThursday` = 0 
      OR WT.`AvailableToWorkFriday` = 0 
      ) 
    ORDER BY CV.ResumeID ASC;