mysql left join 左連接查詢關聯n多張表


left join 左連接即以左表為基准,顯示坐標所有的行,右表與左表關聯的數據會顯示,不關聯的則不顯示。關鍵字為left join on。 
**基本用法如下: 

select table a left join table b on a.id = b.ta_id**

注意:
其中on后面關聯的字段應該是同一字段(兩表關聯的外鍵) 
由於以左表為基准,左表一條記錄如果對應右表多條記錄,那查出的數據中右表的數據也只顯示一條,如果要都顯示,可以用group_contact()將字段用逗號隔開顯示在一條記錄上。所以右表不管有幾張,如果和左表都是一對一關系,則沒問題,存在一對多關系時,需要一定的處理。


 

1、內連接:將兩個表中存在連結關系的字段符合連接條件的記錄形成記錄集

SELECT
    A. NAME,
    B. NAME
FROM
    A
INNER JOIN B ON A.id = B.id

SELECT
    A. NAME,
    B. NAME
FROM
    A,
    B
WHERE
    A.id = B.id

結果是一樣的(內連接的inner關鍵字可省略);

2、外連接:分為左外連接和右外連接

左連接A、B表結果包括A的全部記錄和符合條件的B的記錄。

右聯結A、B表的結果和左聯結B、A的結果是一樣的,也就是說:

SELECT
    A. NAME,
    B. NAME
FROM
    A
LEFT JOIN B ON A.id = B.id

SELECT
    A. NAME,
    B. NAME
FROM
    B
RIGHT JOIN A ON B.id - A.id

 

執行后的結果是一樣的。

3、全聯結

4、無聯結

5、三表聯結查詢

SELECT
    username,
    psw,
    gname,
    tel
FROM
    (
        t1
        LEFT JOIN t2 ON t1.t1_id = t2.t1_id
    )
LEFT JOIN t3 ON t1.t1_id = t3.t1_id

 

6、終極的三表聯結查詢

items:商品表,item_visit_stats:商品訪問表,item_trade_stats:商品銷售表

/*

Source Server         : localhost
Source Server Version : 50505
Source Host           : localhost:3306
Source Database       : test

Target Server Type    : MYSQL
Target Server Version : 50505
File Encoding         : 65001

Date: 2018-09-14 19:00:46
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for items
-- ----------------------------
DROP TABLE IF EXISTS `items`;
CREATE TABLE `items` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT '',
  `price` varchar(255) DEFAULT '',
  `nick` varchar(255) DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';

-- ----------------------------
-- Table structure for item_trade_stats
-- ----------------------------
DROP TABLE IF EXISTS `item_trade_stats`;
CREATE TABLE `item_trade_stats` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `buyer_num` int(11) unsigned DEFAULT '0',
  `item_num` int(11) unsigned DEFAULT '0',
  `seller_nick` varchar(255) DEFAULT '',
  `business_day` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品銷售表';

-- ----------------------------
-- Table structure for item_visit_stats
-- ----------------------------
DROP TABLE IF EXISTS `item_visit_stats`;
CREATE TABLE `item_visit_stats` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_visits` varchar(255) NOT NULL,
  `business_day` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品訪問表';

 



 

SELECT
    i.id,
    i.title,
    SUM(ivs.user_visits) AS uv,
    its.item_num * i.price AS turnover
FROM
    (
        items AS i
        RIGHT JOIN item_visit_stats AS ivs ON i.id = ivs.id
    )
LEFT JOIN (
    SELECT
        id,
        SUM(item_num) AS item_num
    FROM
        item_trade_stats
    WHERE
        seller_nick = "XXXX"
    GROUP BY
        id
) AS its ON its.id = ivs.id
WHERE
    i.nick = "XXXX"
GROUP BY
    i.id
ORDER BY
    uv DESC

 

 

https://blog.csdn.net/chentaocba/article/details/7697825

寫的時候從外層往里寫,一層一層left join,才不容易出錯。


http://www.cnblogs.com/amyStart/p/5965472.html





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM