Mysql 双select查询怎么改写成 Join 的形式?

select
    *
from
    product
where
    product.id in (
        select
            `like`.product_id as id
        from
            `like`
        where
            `like`.user_id = 1
    );

目的:获取某个用户点赞过的所有产品信息

join 的时候,什么条件应该写在 on ?哪些应该写在 where

下面是三个表的 DDL 信息:

CREATE TABLE `account` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `email` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
CREATE TABLE `product` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `price` decimal(10,5) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
CREATE TABLE `like` (
  `id` int NOT NULL AUTO_INCREMENT,
  `user_id` int NOT NULL,
  `product_id` int NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

还有就是我想问一下这种双 Select 的结构对应的是内外左右 join 的哪种呢?

select
    *
from
    product
    join `like` on product.id = `like`.product_id
where
    `like`.user_id = 1

这样是否完备?是否需要指定 join 的内外左右?

阅读 2.1k
1 个回答
  1. 得看是哪种JOIN。如果是内连接,筛选条件写在 ON 或者 WHERE 查出来的结果是一样的,而且MySQL引擎会对此做一定的优化,查询速度上也相差无几。但如果是左连接这种就不一样了,把条件写在 ON 里边时,筛选条件就不会对左表起到筛选作用,但是可能会影响到联表后右表的一些值是否为NULL。
  2. 这个具体场景对应的应该是 INNER JOIN ;
  3. MySQL默认JOIN就是 INNER JOIN ,这里可以不用再额外指定。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题