關(guān)聯(lián)查詢和子查詢一般是不一起用的,不過復(fù)雜場(chǎng)景下也會(huì)有使用,本文對(duì)此略加介紹。
場(chǎng)景
例如,A表是省份表,B表是城市表,C表是城市里的萬達(dá)廣場(chǎng)表,D表是萬達(dá)廣場(chǎng)里的店鋪表。
現(xiàn)在,當(dāng)前頁面需要調(diào)取城市表,這個(gè)表內(nèi)容要求:
每個(gè)市名左側(cè)要掛上省名,右側(cè)要列出該市所有的萬達(dá)廣場(chǎng)名單(不止一個(gè)廣場(chǎng)),每個(gè)萬達(dá)廣場(chǎng)名單后面要跟上該廣場(chǎng)的大名牌的名單。其中,每個(gè)市的萬達(dá)廣場(chǎng)和大品牌的名單合并起來寫在一個(gè)單元格里。
一個(gè)典型的行是:
| 省 | 市 | 萬達(dá)廣場(chǎng) |
|---|---|---|
| 湖南 | 長(zhǎng)沙 | A萬達(dá) 老鳳祥 GUCCI... B萬達(dá) 老鳳祥 俏江南 |
思路
萬達(dá)表分別跟市表、商鋪表做內(nèi)關(guān)聯(lián)查詢,這作為一個(gè)子查詢,以市表id為索引,然后,市表左關(guān)聯(lián)省表得到省名,市表也左關(guān)聯(lián)上面的子查詢,得到萬達(dá)和商鋪的一攬子信息。
實(shí)現(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);
重點(diǎn)在于:
1、上面代碼先獲取子查詢的代碼本身,select(false)表示只生成代碼,不真正查詢。生成的代碼不帶左右括號(hào),所以下文用的時(shí)候需要帶上左右括號(hào)。
2、該group_concat的group_concat,因?yàn)槲覀兇蛩惆讶f達(dá)和商鋪寫到一個(gè)單元格里。
$市_list = Db::table('市表')
->join('省表', '市.省_id = 省.id', 'LEFT')
->join('('.$萬達(dá)_list.') as 萬達(dá)別名', '市.id = 萬達(dá)別名.id', 'LEFT')
->field('市.id, ...其他字段')
->select();
重點(diǎn)在于,將查詢語句括起來,給一個(gè)別名。