zoukankan      html  css  js  c++  java
  • MySQL中使用INNER JOIN来实现Intersect并集操作

    MySQL中使用INNER JOIN来实现Intersect并集操作


    一、业务背景

    我们有张表设计例如以下:

    CREATE TABLE `user_defined_value` (
      `RESOURCE_ID` varchar(20) DEFAULT NULL,
      `COLUMN_NAME` varchar(20) DEFAULT NULL,
      `VALUE` varchar(255) DEFAULT NULL,
      KEY `ID_IDX` (`RESOURCE_ID`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    

    RESOURCE_ID是资源的唯一标识

    COLUMN_NAME是资源的一个属性名称

    VALUE是资源的属性值


    二、需求

    如今须要从表中查出属性A='1'且属性B='2'的资源ID


    三、分析

    这里须要查的是同一时候满足两个属性的资源ID,假设是或的关系,那么SQL会非常easy

    SELECT DISTINCT RESOURCE_ID FROM USER_DEFINED_VALUE 
    WHERE (COLUMN_NAME = 'A' AND VALUE in ('1'))  
    OR (COLUMN_NAME = 'B' AND VALUE in ('2'))

    当是且关系时,这里并不能简单的将ORkeyword换成AND。须要先把满足每一个属性的资源查出来。再取并集

    在百度上查到SQL Server和Oracle都支持Intersect。能够直接将两个同样结构的查询结果取交集,而MySQL并没有Intersectkeyword。那么我们能够怎样实现呢?


    四、使用INNER JOIN xxx USING xxx

    SELECT DISTINCT RESOURCE_ID FROM USER_DEFINED_VALUE 
    INNER JOIN (SELECT DISTINCT RESOURCE_ID FROM USER_DEFINED_VALUE WHERE  (COLUMN_NAME = 'A' AND VALUE in ('1')) ) t0 USING (RESOURCE_ID) 
    INNER JOIN (SELECT DISTINCT RESOURCE_ID FROM USER_DEFINED_VALUE WHERE  (COLUMN_NAME = 'B' AND VALUE in ('2')) ) t1 USING (RESOURCE_ID)

    第一句话会查出表中全部的资源ID

    第二句话或查出属性A='1'的资源ID,并和第一句话的查询结果取交集

    第三句话或查出属性B='2'的资源ID。并和前面的查询结果取交集

    这样,还能够继续加其它的属性

  • 相关阅读:
    实操ES6之Promise
    RabbitMQ入门指南
    【从零开始撸一个App】PKCE
    SpringCloud Alibaba Nacos Config 配置中心
    SpringCloud Alibaba Nacos 服务发现 Feign进行消费
    SpringCloud Alibaba Nacos 服务发现 RestTemplate进行消费
    SpringCloud Alibaba Nacos 服务注册
    SpringCloud Alibaba Nacos 服务治理中心
    开发者-管理者 设计陷阱
    java8中的Stream API实战
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/6850377.html
Copyright © 2011-2022 走看看