2017-08-17 14 views
0

以下查詢正確地按預期方式提取數據,但左表與lnk_cat_isrc表連接並通過該表連接到catalogue表,如果存在多個項目,則返回重複數據catalogueisrc表具有相同的ISRC代碼:MySQL - 唯一行,僅對應於3個表中的一個

SELECT 
       isrc.ISRC, 
       isrc.Track_Name, 
       isrc.ArtistName, 
       isrc.TitleVersion, 
       isrc.Track_Time, 
       `isrc_performer`.`PerformerName` , 
       `performer_category`.`PerformerCategory` , 
       `isrc_performer`.`PerformerRole` , 
       `isrc`.`isrc_ID`, 
       `isrc_performer`.`Perf_ID` 

     FROM `isrc` 

     LEFT JOIN `isrc_performer` ON (isrc.isrc_ID = isrc_performer.isrc_ID) 
     LEFT JOIN `performer_category` ON (performer_category.PerfCat_ID = isrc_performer.PerfCat_ID) 
     LEFT JOIN `lnk_cat_isrc` ON (lnk_cat_isrc.isrc_ID = isrc.isrc_ID) 
     LEFT JOIN `catalogue` ON (catalogue.ID = lnk_cat_isrc.cat_id) 
     ORDER BY isrc_ID  desc LIMIT 0 , 10 
     "; 

我不能isrc使用group by,因爲isrc_performer表可以有不止一個演員到一個ISRC。

所以關係是這樣的: catalogue表中的幾項從isrc表中可以有幾個相同的項。反過來,每個isrc表可在isrc_performer表中有多個條目。

我想要的是顯示isrc_performer與每個isrc相關的所有相應數據,但不會重複從catalogue表中的每個項目。 我也想顯示其餘所有「空」isrcs(那些在isrc_performer表中沒有任何數據)

你能給我任何想法嗎?

P.S.儘管我並沒有從catalogue表中抽取任何數據,但我使用它來通過目錄號進行搜索,當用戶爲$where_condition變量定義搜索條件時,因此我需要將其保留在查詢中。 即$where_condition = "catalogue.Catalogue LIKE '%test%' OR ISRC LIKE '%test%' OR Track_Name LIKE '%test%' OR ArtistName LIKE '%test%' OR TitleVersion LIKE '%test%' OR PerformerName LIKE '%test%' OR PerformerCategory LIKE '%test%' OR PerformerRole LIKE '%test%'";

------ UPD:

試圖以圖形方式表示這3個關係可能變化:

cat1 - isrc1 - performer1 
     isrc2 - performer1 
      - performer2 
      - performer3 

cat2 - isrc2 - performer1 
      - performer2 
      - performer3 
    - isrc3 - performer2 
      - performer4 

cat3 - isrc4 
    - isrc1 - performer1 

UPD(添加圖片)

這裏是屏幕打印。正如你在圖片1上看到的那樣,有9行有相同的isrc數字,但是有三個重複的表演者Jason,David,Paul。

enter image description here

這是因爲3個不同的目錄項具有此確切ISRC與3個不同的表演者逐PIC 2

enter image description here

= 1(ISRC)* 3(目錄)* 3(表演者)= 9行輸出

我只想要的是,Performers網格將只顯示這isrc爲每個表演者的3行。

+2

請參閱[我爲什麼應該提供一個用於我認爲是非常簡單的SQL查詢的MCVE](http://meta.stackoverflow.com/questions/333952/why-should-i-提供-AN-MCVE換什麼,似乎對我將要-A-極簡單的SQL查詢) – Strawberry

+0

@Strawberry我已經更新了我的問題 – Elen

+0

所以我想'distinct'沒有解決不了的重複的問題。那麼它不是一個真正的重複問題,而是一個重複的價值prolbme?你不想'看到列值重複?但是,你沒有任何次序會使重複的值有意義。一個預期結果的例子將有助於顯示你現在得到的和你想要的。 – xQbert

回答

1

---重新排列答案以將「最佳」選項放在最上面..但所有這一切都是零..沒有任何來自lnk_cat_isrc或目錄的數據被返回,爲什麼目錄上的過濾使得區別?我們將返回所有isrc而不管任何過濾,因爲它是左連接...

因此,這給帶給樣本數據的問題帶來了什麼樣的預期結果。

可能更優雅 ...(但不知道這是否會更快)的移動距離存在,只是使用不同的子查詢這樣的目錄查詢總是每ISRC返回1行;解決保留左連接的1-M問題,從而保持isrc記錄不在目錄限制中。 返回所有isrc信息執行者信息(如果存在),執行者類別信息(如果存在)以及目錄信息(僅當與商品目錄過濾器匹配)。

SELECT isrc.ISRC 
    , isrc.Track_Name 
    , isrc.ArtistName 
    , isrc.TitleVersion 
    , isrc.Track_Time 
    ,`isrc_performer`.`PerformerName` 
    ,`performer_category`.`PerformerCategory` 
    ,`isrc_performer`.`PerformerRole` 
    ,`isrc`.`isrc_ID` 
    ,`isrc_performer`.`Perf_ID` 
FROM `isrc` 
LEFT JOIN `isrc_performer` 
    ON isrc.isrc_ID = isrc_performer.isrc_ID 
LEFT JOIN `performer_category` 
    ON performer_category.PerfCat_ID = isrc_performer.PerfCat_ID 
LEFT JOIN (SELECT distinct lnk_cat_isrc.isrc_ID 
      FROM `lnk_cat_isrc` 
      INNER JOIN `catalogue` 
      ON catalogue.ID = lnk_cat_isrc.cat_id 
      WHERE...) DCat 
    ON Dcat.isrc_ID = isrc.isrc_ID 
ORDER BY isrc_ID  desc 
LIMIT 0 , 10; 

正如您指出連接導致問題。所以消除連接並使用存在的符號。由於您沒有從目錄中選擇任何值,因此獨特也會奏效;儘管存在應該更快。

快,但不包括所有的ISRC記錄......(不知道爲什麼還是不存在,也應該把他們的...)

SELECT isrc.ISRC 
    , isrc.Track_Name 
    ,isrc.ArtistName 
    ,isrc.TitleVersion 
    ,isrc.Track_Time 
    ,`isrc_performer`.`PerformerName` 
    ,`performer_category`.`PerformerCategory` 
    ,`isrc_performer`.`PerformerRole` 
    ,`isrc`.`isrc_ID` 
    ,`isrc_performer`.`Perf_ID` 
    FROM `isrc` 
    LEFT JOIN `isrc_performer` 
     ON (isrc.isrc_ID = isrc_performer.isrc_ID) 
    LEFT JOIN `performer_category` 
     ON (performer_category.PerfCat_ID = isrc_performer.PerfCat_ID) 
    WHERE EXISTS (SELECT * 
        FROM `lnk_cat_isrc` 
        INNER JOIN `catalogue` 
        ON catalogue.ID = lnk_cat_isrc.cat_id 
        --and your other criteria 
        WHERE (lnk_cat_isrc.isrc_ID = isrc.isrc_ID) 
       ) 
    OR NOT EXISTS (SELECT * 
        FROM `lnk_cat_isrc` 
        WHERE lnk_cat_isrc.isrc_ID = isrc.isrc_ID 
    ORDER BY isrc_ID desc 
    LIMIT 0 , 10 

或使用SELECT DISTINCT簡單的直線前進;但很慢

SELECT isrc.ISRC 
    , isrc.Track_Name 
    ,isrc.ArtistName 
    ,isrc.TitleVersion 
    ,isrc.Track_Time 
    ,`isrc_performer`.`PerformerName` 
    ,`performer_category`.`PerformerCategory` 
    ,`isrc_performer`.`PerformerRole` 
    ,`isrc`.`isrc_ID` 
    ,`isrc_performer`.`Perf_ID` 
    FROM `isrc` 
    LEFT JOIN `isrc_performer` 
    ON (isrc.isrc_ID = isrc_performer.isrc_ID) 
    LEFT JOIN `performer_category` 
    ON (performer_category.PerfCat_ID = isrc_performer.PerfCat_ID) 
    LEFT JOIN `lnk_cat_isrc` 
    ON (lnk_cat_isrc.isrc_ID = isrc.isrc_ID) 
    LEFT JOIN `catalogue` 
    ON (catalogue.ID = lnk_cat_isrc.cat_id) 
    --AND (other criteria on catalog here, cause in a where clause you left joins will behave like inner joins) 
    ORDER BY isrc_ID desc 
    LIMIT 0 , 10; 
+0

omg!這看起來正是我需要的......讓我跑一些測試 – Elen

+0

權,'exist' deffo運行速度更快,但它仍然作爲我的原始查詢 - 重複所有行每個'catalogue'項目...'Distinct'不正是我期待的是什麼,但速度較慢......是的,當我指定一個cat.num時,我沒有得到沒有表演者的'isrc' ... – Elen

+0

這對我來說沒有多大意義存在不能將目錄中的重複記錄作爲目錄不再加入。 ahhh .. lnk_cat_isrc有cat_ID,我們需要移動它的連接到存在以及...因爲你不顯示數據形式lnk_cat_isrc它應該工作...這解釋了爲什麼獨特的工作。而這並沒有; P不知道如果存在應該是一個左連接,或者如果它可能是一個內部...我會留下讓你思考;它對你必須放置目錄關鍵詞/過濾器的位置有所影響。 – xQbert

相關問題