Mysql中的級聯查詢

jopen 10年前發布 | 9K 次閱讀 MySQL 數據庫服務器

我的所有的表都是沒有關聯關系的,解耦

一共是四個表  tb_user 用戶表

CREATE TABLE `tb_user` (
  `id` int(100) NOT NULL AUTO_INCREMENT COMMENT 'Id',
  `name` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `age` double(255,0) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

tb_order 訂單表

CREATE TABLE `tb_order` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `price` double(255,0) DEFAULT NULL,
  `user_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;

tb_goods 商品表

CREATE TABLE `tb_goods` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `weight` double(11,0) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

他們的關系是 用戶表和訂單表是一對多,一個用戶可以創建多個訂單,

訂單和商品是多對多,一個訂單可以擁有多個商品,當然一個商品也可以擁有多個訂單,這里的商品是類級別的商品

他們是多對多關系所以說必須擁有一個中間表,也就是tb_order_goods

CREATE TABLE `tb_order_goods` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `order_id` int(11) DEFAULT NULL,
  `goods_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;

中間表就是用來關聯Order和User的


這個是我所有的表

SELECT*from tb_goods;
SELECT*from tb_order;
SELECT*from tb_order_goods;
SELECT*from tb_user;

現在我們根據用戶ID查詢用戶所有的訂單,和訂單相關的信息

分析可以知道現在求的是交集,

inner join 和 left join  ,right join的關系就是交集,和補集的關系

SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2 
ON table_name1.column_name=table_name2.column_name


這個表很直觀,剛剛的需求也就是要交集

所以現在開始寫sql

SELECT
    g. NAME
FROM
    tb_order o
INNER JOIN tb_order_goods og ON o.id = og.order_id
INNER JOIN tb_goods g ON og.order_id = g.id
WHERE
    o.user_id = 1


這個sql就是說的是獲取user_id =1 購買的所有商品


其他兩個的話是求補給

現在讓那個我們來試一試,看看結果咯

SELECT
    *
FROM
    tb_order o
LEFT JOIN tb_order_goods og ON og.order_id = o.id
LEFT JOIN tb_goods g ON g.id = og.goods_id
WHERE
    o.user_id = 1

現在我們看看right join ,其實很簡單,高中數學好的話,基本沒有問題,有問題肯定是智商問題

看圖

這個就是咯,現在看sql 語句咯,其實很簡單的啦,設計數據庫的時候最好不要有管理關系,這樣遷移還有拓展不好,你懂得

SELECT
    *
FROM
    tb_order o
RIGHT  JOIN tb_order_goods og ON og.order_id = o.id
RIGHT JOIN tb_goods g ON g.id = og.goods_id
WHERE
    o.user_id = 1

這個是結果


來自: http://my.oschina.net/heinrichchen/blog/601496

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!