關(guān)聯(lián)查詢和子查詢一般是不一起用的膘螟,不過復(fù)雜場景下也會有使用,本文對此略加介紹碾局。
場景
例如荆残,A表是省份表,B表是城市表净当,C表是城市里的萬達(dá)廣場表内斯,D表是萬達(dá)廣場里的店鋪表。
現(xiàn)在像啼,當(dāng)前頁面需要調(diào)取城市表俘闯,這個表內(nèi)容要求:
每個市名左側(cè)要掛上省名,右側(cè)要列出該市所有的萬達(dá)廣場名單(不止一個廣場)忽冻,每個萬達(dá)廣場名單后面要跟上該廣場的大名牌的名單真朗。其中,每個市的萬達(dá)廣場和大品牌的名單合并起來寫在一個單元格里僧诚。
一個典型的行是:
省 | 市 | 萬達(dá)廣場 |
---|---|---|
湖南 | 長沙 | A萬達(dá) 老鳳祥 GUCCI... B萬達(dá) 老鳳祥 俏江南 |
思路
萬達(dá)表分別跟市表遮婶、商鋪表做內(nèi)關(guān)聯(lián)查詢,這作為一個子查詢湖笨,以市表id為索引旗扑,然后,市表左關(guān)聯(lián)省表得到省名慈省,市表也左關(guān)聯(lián)上面的子查詢臀防,得到萬達(dá)和商鋪的一攬子信息。
實現(xiàn)
$萬達(dá)_list = Db::table('萬達(dá)表')
->join('市表', '萬達(dá).市_id = 市.id')
->join('商鋪表', '商鋪.萬達(dá)_id = 萬達(dá).id')
->field('市.id, group_concat(商鋪名) AS 商鋪_name,...其他想要的字段都合并)
->group('市.id')
->select(false);
重點在于:
1辫呻、上面代碼先獲取子查詢的代碼本身清钥,select(false)表示只生成代碼,不真正查詢放闺。生成的代碼不帶左右括號祟昭,所以下文用的時候需要帶上左右括號。
2怖侦、該group_concat的group_concat篡悟,因為我們打算把萬達(dá)和商鋪寫到一個單元格里。
$市_list = Db::table('市表')
->join('省表', '市.省_id = 省.id', 'LEFT')
->join('('.$萬達(dá)_list.') as 萬達(dá)別名', '市.id = 萬達(dá)別名.id', 'LEFT')
->field('市.id, ...其他字段')
->select();
重點在于匾寝,將查詢語句括起來搬葬,給一個別名。