MYSQL關(guān)聯(lián)關(guān)系查詢方式
MYSQL關(guān)聯(lián)關(guān)系查詢
關(guān)聯(lián)關(guān)系查詢
首先,讓我們回顧一下你的原始查詢:
SELECT u.*, d.id AS aid, d.name, d.pro, d.city, d.country, d.detail, d.tel AS atel, r.name AS roleName FROM tb_user u INNER JOIN tb_address d ON u.id = d.user_id LEFT JOIN tb_role_user ur ON ur.user_id = u.id LEFT JOIN tb_role r ON r.id = ur.role_id;
這個查詢做了以下幾件事
- 從
tb_user
表中選擇所有列(u.*
)。 - 使用內(nèi)連接(
INNER JOIN
)將tb_user
表與tb_address
表關(guān)聯(lián)起來,條件是tb_user
表的id
列等于tb_address
表的user_id
列。 - 從
tb_address
表中選擇特定的列,并為某些列指定別名(如d.id AS aid
)。 - 使用左外連接(
LEFT JOIN
)將結(jié)果集與tb_role_user
表關(guān)聯(lián)起來,條件是tb_role_user
表的user_id
列等于tb_user
表的id
列。 - 再使用左外連接將上一步的結(jié)果集與
tb_role
表關(guān)聯(lián)起來,條件是tb_role
表的id
列等于tb_role_user
表的role_id
列。 - 從
tb_role
表中選擇name
列,并為其指定別名roleName
。
現(xiàn)在,我將對這個查詢進行擴寫,包括一些額外的解釋和可能的優(yōu)化:
-- 選擇用戶及其關(guān)聯(lián)的地址、角色信息 SELECT -- 用戶表的所有列 u.id AS userId, u.username, u.email, u.password, u.created_at, u.updated_at, -- 地址表的特定列及別名 d.id AS addressId, d.name AS addressName, d.province AS pro, d.city, d.country, d.detail AS addressDetail, d.tel AS addressTel, -- 角色名的別名 r.name AS roleName FROM tb_user u -- 內(nèi)連接:只選擇有地址的用戶 INNER JOIN tb_address d ON u.id = d.user_id -- 左外連接:選擇所有用戶及其可能的角色關(guān)聯(lián) LEFT JOIN tb_role_user ur ON u.id = ur.user_id -- 再左外連接:選擇所有角色關(guān)聯(lián)及其角色名 LEFT JOIN tb_role r ON ur.role_id = r.id;
MySQL自關(guān)聯(lián)查詢
定義表areas,結(jié)構(gòu)如下
id
atitle
pid
因為省沒有所屬的省份,所以可以填寫為null
城市所屬的省份pid,填寫省所對應(yīng)的編號id
這就是自關(guān)聯(lián),表中的某一列,關(guān)聯(lián)了這個表中的另外一列,但是它們的業(yè)務(wù)邏輯含義是不一樣的,城市信息的pid引用的是省信息的id
在這個表中,結(jié)構(gòu)不變,可以添加區(qū)縣、鄉(xiāng)鎮(zhèn)街道、村社區(qū)等信息
- 創(chuàng)建areas表的語句如下:
create table areas( id int primary key, atitle varchar(20), pid int, foreign key(pid) references areas(id) );
查詢一共有多少個省
- 查詢省的名稱為“山西省”的所有城市
select city.* from areas as city inner join areas as province on city.pid=province.id where province.atitle='山西省';
- 查詢市的名稱為“廣州市”的所有區(qū)縣
select dis.*,dis2.* from areas as dis inner join areas as city on city.id=dis.pid left join areas as dis2 on dis.id=dis2.pid where city.atitle='廣州市';
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL啟動報錯問題InnoDB:Unable to lock/ibdata1 error
這篇文章主要介紹了MySQL啟動報錯問題InnoDB:Unable to lock/ibdata1 error,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07CentOS6.9下mysql 5.7.17安裝配置方法圖文教程
這篇文章主要為大家詳細介紹了CentOS6.9下mysql 5.7.17安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10