• 技术文章 >数据库 >mysql教程

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

    2016-06-01 13:08:38原创546

    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会很简单

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

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

    在百度上查到SQL Server和Oracle都支持Intersect,可以直接将两个相同结构的查询结果取交集,而MySQL并没有Intersect关键字,那么我们可以如何实现呢?


    四、使用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,并和前面的查询结果取交集

    这样,还可以继续加其他的属性

    复制去Google翻译翻译结果或
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:
    上一篇:jdbcTemplate操作MYSQL数据库时有外键约束无法插入或删除_MySQL 下一篇:mysql---union的用法_MySQL
    Web大前端开发直播班

    相关文章推荐

    • MySQL怎么从二进制内容看InnoDB行格式• mysql怎么增加权限• 夯实MySQL基础的问题归纳• 浅析MySQL中的事务隔离级别,聊聊其实现原理• 怎样使MySQL的索引更高效?
    1/1

    PHP中文网