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;
這個(gè)查詢做了以下幾件事
- 從
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)在,我將對這個(gè)查詢進(jìn)行擴(kuò)寫,包括一些額外的解釋和可能的優(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)如下
idatitlepid
因?yàn)槭]有所屬的省份,所以可以填寫為null
城市所屬的省份pid,填寫省所對應(yīng)的編號(hào)id
這就是自關(guān)聯(lián),表中的某一列,關(guān)聯(lián)了這個(gè)表中的另外一列,但是它們的業(yè)務(wù)邏輯含義是不一樣的,城市信息的pid引用的是省信息的id
在這個(gè)表中,結(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) );
查詢一共有多少個(gè)省
- 查詢省的名稱為“山西省”的所有城市
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é)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL查詢in操作 查詢結(jié)果按in集合順序顯示
MySQL 查詢in操作,查詢結(jié)果按in集合順序顯示的實(shí)現(xiàn)代碼,需要的朋友可以參考下。2010-12-12
2026年新手版MySQL數(shù)據(jù)庫備份與恢復(fù)的完整指南
日常操作中,新手很容易誤刪數(shù)據(jù)庫、誤刪表,或者服務(wù)器故障導(dǎo)致數(shù)據(jù)丟失,一旦丟失很難恢復(fù),而MySQL備份操作簡單,花5分鐘做好備份,后續(xù)無論出現(xiàn)什么問題,都能快速恢復(fù)數(shù)據(jù),避免損失,下面小編就和大家詳細(xì)介紹下新手首先的mysqldump?備份方法吧2026-04-04
centos7環(huán)境下創(chuàng)建mysql5.6多實(shí)例的方法詳解
這篇文章主要介紹了centos7環(huán)境下創(chuàng)建mysql5.6多實(shí)例的方法,詳細(xì)分析了centos7創(chuàng)建mysql5.6多實(shí)例的具體步驟、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下2020-02-02
mysql添加索引方法詳解(Navicat可視化加索引與sql語句加索引)
索引用來快速地尋找那些具有特定值的記錄,如果沒有索引,執(zhí)行查詢時(shí)MySQL必須從第一個(gè)記錄開始掃描整個(gè)表的所有記錄,直至找到符合要求的記錄,表里面的記錄數(shù)量越多,代價(jià)就越高,下面這篇文章主要給大家介紹了關(guān)于mysql添加索引的相關(guān)資料,需要的朋友可以參考下2022-11-11
大數(shù)據(jù)小內(nèi)存排序問題如何巧妙解決
文章介紹了大數(shù)據(jù)小內(nèi)存排序的三種方法:數(shù)據(jù)庫排序、分治法和位圖法,數(shù)據(jù)庫排序簡單但速度慢,對設(shè)備要求高;分治法高效但實(shí)現(xiàn)復(fù)雜;位圖法可讀性差,但存儲(chǔ)空間受限2025-01-01
在sql中對兩列數(shù)據(jù)進(jìn)行運(yùn)算作為新的列操作
這篇文章主要介紹了在sql中對兩列數(shù)據(jù)進(jìn)行運(yùn)算作為新的列操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10

