2017-05-04 82 views
0

我有一個MySQL的結果(通過連接三個表獲得),看起來像這樣:消除MySQL的結果不需要行

article_id | article_name | tag_id | tag  | article_ref | tag_ref 
----------------------------------------------------------------------------------- 
    00021 | Red jumper | 14 | fisherman | 00021 | 14 
    00023 | Fishermans knit| 13 | batwing | 00023 | 13  
    00023 | Fishermans knit| 14 | fisherman | 00023 | 14 
    00023 | Fishermans knit| 15 | rollneck | 00023 | 15  
    00025 | Green Guernsey | 14 | fisherman | 00025 | 14 

(搜索過程%漁夫%)
我通過搜索獲得此%像%結果並比較兩個表 - 文章表和標記表(使用關係表tagsrel)。

我想消除相同article_id的多餘行(請參見第一列)。 我期待與

SELECT FROM (SELECT FROM /*original query */)

有可能是一個DISTINCT這樣做呢?儘管這些行不是唯一的,正如你所看到的。理想情況下,我想只選擇具有該ID的第一個。所以我的結果將是:

article_id | article_name | tag_id | tag  | article_ref | tag_ref 
----------------------------------------------------------------------------------- 
    00021 | Red jumper | 14 | fisherman | 00021 | 14 
    00023 | Fishermans knit| 13 | batwing | 00023 | 13  
    00025 | Green Guernsey | 14 | fisherman | 00025 | 14 

我的問題還真是可以本人申請(如上)另一個選擇將此消除說行? 預先感謝(我一直停留在這幾天了!!!)


解決方案:按照以下胡安·卡洛斯·Oropeza的回答,與別名添加插入查詢

SELECT * 
FROM (SELECT *, 
       @rn := if(@article = `article_id`, 
         @rn + 1, 
         if(@article := `article_id`, 1, 1) 
         ) as rn 
     FROM (/*query*/) AS bob 
     CROSS JOIN (SELECT @rn := 0, @article := '') as T 
     ORDER BY `article_id`, tag_id 
    ) T 
WHERE rn = 1 
ORDER BY `article_id` 
+1

爲什麼你選擇TAG_ID 13漁人編織? –

+0

因此,連接會導致這些結果出現不同的tag_ID,tag和tag_rel ....如果您不需要這些字段...爲什麼將它們包括在連接中或選擇?或者你可以使用group_concat()來合併這些記錄的所有值......或者更好......也許你需要兩個單獨的查詢。一個只是文章,另一個是細節? – xQbert

+0

哦,搜索是%fisherman%,我應該說的! – gavin

回答

1

使用變量來選擇的每個article_id

SQL DEMO

0123的第一個

輸出

enter image description here

aditional的提示:

SELECT bda_articles.article_name,bda_articles.article_id, bda_tags.*, bda_tagsrel.* 
FROM bda_articles 
JOIN bda_tagsrel 
    ON bda_articles.article_id = bda_tagsrel.article_ref      
JOIN bda_tags 
    ON bda_tagsrel.tag_ref=bda_tags.tag_id   
WHERE (`article_name` LIKE "%fisherman%" 
    OR `tag` LIKE "%fisherman%") 
    AND tag_ref = (SELECT MIN(tag_ref) 
        FROM bda_tagsrel TAG 
        WHERE TAG.article_ref = bda_articles.article_id) 
+0

好的,謝謝,我會試試這個,但是在這個地方我會把我的原始查詢? – gavin

+0

查看演示。您可以使用您的原始查詢而不是'YourTable'來創建該表。 –

+0

這看起來很有趣,我會嘗試這一點 - 它可能需要我一段時間,因爲我的MySQL是基本的。我很驚訝,雖然沒有一個簡單的函數只選擇一個具有特定值的行之一 – gavin