如何利用join尋找多對多關係?

來源:互聯網
上載者:User
關鍵字 php mysql
比如我有3張表..
article(id,title,author,content) -文章表
tags(id,name) -標籤表
rationship(article_id,tags_id) -文章標籤關聯表

目的是得到一個結果集,結果集要包含標籤.

原來的做法:
$articleList= DB::table('article')->get(); //擷取所有文章
//文章資訊整理

for($i = 0;$i < count($articleList);$i++){    $artagslist = $articletagsModel->getRelateTags($articleList[$i]->id);//擷取關係表中對應文章id的所有標籤id    if(isset($artagslist)) {        $tagsArray = array();        foreach ($artagslist as $values) {            //遍曆標籤id,從標籤表中尋找結果..            $singletags = $tagsModel->getTagsById($values->tags_id);            //把結果追加到數組$tagsArray中..            array_push($tagsArray, $singletags);        }        $articleList[$i]->tags = $tagsArray; //在最開始的資料增加一個欄位儲存標籤數組    }}

最後得到的數組如下:
array:1 [▼
0 => {#176 ▼

+"id": "1"+"title": "這是標題"+"author": "這是作者"+"content": "這是文章本文"+"tags": array:2 [▼  0 => {#182 ▼    +"id": 5    +"name": "nodejs"    +"create_time": null    +"update_time": null    +"user_id": null    +"num": 1  }  1 => {#183 ▼    +"id": 4    +"name": "python"    +"create_time": null    +"update_time": null    +"user_id": null    +"num": 1  }]

}
]

雖然我原來的做法也可以達到目的,但是總覺得這種做法有點冗餘,所以想問問有沒有更好的辦法?或者說可以直接用SQL一句話解決這個問題。謝謝!

回複內容:

比如我有3張表..
article(id,title,author,content) -文章表
tags(id,name) -標籤表
rationship(article_id,tags_id) -文章標籤關聯表

目的是得到一個結果集,結果集要包含標籤.

原來的做法:
$articleList= DB::table('article')->get(); //擷取所有文章
//文章資訊整理

for($i = 0;$i < count($articleList);$i++){    $artagslist = $articletagsModel->getRelateTags($articleList[$i]->id);//擷取關係表中對應文章id的所有標籤id    if(isset($artagslist)) {        $tagsArray = array();        foreach ($artagslist as $values) {            //遍曆標籤id,從標籤表中尋找結果..            $singletags = $tagsModel->getTagsById($values->tags_id);            //把結果追加到數組$tagsArray中..            array_push($tagsArray, $singletags);        }        $articleList[$i]->tags = $tagsArray; //在最開始的資料增加一個欄位儲存標籤數組    }}

最後得到的數組如下:
array:1 [▼
0 => {#176 ▼

+"id": "1"+"title": "這是標題"+"author": "這是作者"+"content": "這是文章本文"+"tags": array:2 [▼  0 => {#182 ▼    +"id": 5    +"name": "nodejs"    +"create_time": null    +"update_time": null    +"user_id": null    +"num": 1  }  1 => {#183 ▼    +"id": 4    +"name": "python"    +"create_time": null    +"update_time": null    +"user_id": null    +"num": 1  }]

}
]

雖然我原來的做法也可以達到目的,但是總覺得這種做法有點冗餘,所以想問問有沒有更好的辦法?或者說可以直接用SQL一句話解決這個問題。謝謝!

sql恐怕做不了多次嵌套,如果你只是要文章的tag還好,同時還要tag關聯的文章列表就不行了。

不過通常沒有這種需求吧?頁面上列出所有文章很常見,提供文章的簡要內容很常見,列出文章的tag也很常見,但是同時把tag相關的文章列出來的就沒見過了。你應該根據最終的顯示是否需要來考慮sql的最佳化,而不是力求把所有資料都讀出來。

另外,從你列出的資料來看,tag有個名字足夠了,建立時間修改時間建立者之類的這種東西真的沒用,如果不是有的架構對id有強制要求,這個表的id都沒用。

如果需要tag相關的文章建議用ajax去二次擷取,文章使用的tag可以考慮使用mysql的group_conact(好像是吧,懶的去查了),作用是把group by分組的內容串連成字串。例如
select articles.*, group_conact(tag.name, ', ') from articles left join tags ...
具體的自己查mysql手冊吧。

select ar.*,t.* from article as ar left join relationship as rs on ar.id = rs.article_id left join tags as t on rs.tags_id =t.id ,這是sql語句,調用model操作資料庫時拼接起來就行

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.