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。并和前面的查询结果取交集

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

MySQL中使用INNER JOIN来实现Intersect并集操作的更多相关文章

  1. Mysql 中Left/Right join on后面and和where条件查询的差异-Mysql SQL运算符是有优先级

    一.Mysql中Left/Right join on后面and和where条件查询的差异 1.建两张测试表,一张商户定义表.一张商户操作状态明细表 1)商户定义表 CREATE TABLE hope. ...

  2. 在MySQL中使用init-connect与binlog来实现用户操作追踪记录

    在MySQL中使用init-connect与binlog来实现用户操作追踪记录 分类: MySQL 前言: 测试环境莫名其妙有几条重要数据被删除了,由于在binlog里面只看到是公用账号删除的,无法查 ...

  3. 关于MySQL中的left join、on、where的一点深入

    原文地址:http://www.oschina.net/question/89964_65912?sort=default&p=3#answers 即使你认为自己已对 MySQL 的 LEFT ...

  4. mysql中更新或者删除语句中子语句不能操作同一个表You can't specify target table 'test' for update in FROM clause

    问题描述:有个数据表test,有个字段value,如下 mysql> select * from test;+----+------------------------------------+ ...

  5. MySQL中链接查询inner join与left join使用

    连接查询其实就是对两个表记录做笛卡尔乘积.如果不指定连接条件的话,则会对每行都做笛卡尔乘积,这样最后返回的结果树就会是两个表记录数的乘积:如果指定则,则仅对符合列条件的行进行笛卡尔乘积,并返回结果.在 ...

  6. mysql中的几种join 及 full join问题

    [注意]:Oracle数据库支持full join,mysql是不支持full join的,但仍然可以同过左外连接+ union+右外连接实现 初始化SQL语句:   /*join 建表语句*/   ...

  7. MySQL中基本的多表连接查询教程

    一.多表连接类型1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如: SELECT * FROM table1 CROSS JOIN ...

  8. Mysql中的语句优化

    1.EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划. 下面来个简单的示例,标注(1.2.3.4.5)我们要重点关注的数据: type列,连接类型.一个好的SQL语句至少要 ...

  9. Mysql 中完善的帮助命令

    Mysql 中完善的帮助命令 Mysql 中的帮助系统很完善,很多操作都可以通过命令行直接获得帮助,如下示例: Mysql 命令行帮助 [root@mysql1 mydata1]# mysql -S ...

随机推荐

  1. ASP.NET MVC生成静态页面

    1.先付上封装好生成静态页的原代码: public class Common { #region 获取模板页的Html代码 /// <summary> /// 获取页面的Html代码 // ...

  2. [LOJ6235]区间素数个数

    题目大意: 给定$n(n\leq10^{11})$,求$\pi(n)$. 思路: 计算$\pi$函数有$O(n^{\frac23})$的Lehmer算法,这里考虑$O(\frac{n^{\frac34 ...

  3. vs2013 x64 编译汇编代码

    x64不再支持__asm, 只能单独放在一个.asm中. xxx.asm--------属性 应用    会出现 自定义生成工具.  下面黑体是我们修改的内容.

  4. 解决每次启动Office都出出现设置向导的问题

    昨天不知道怎么地,每次打开Excel都会出现"正在配置Office"的设置向导,并且修复.重置用户均无法解决. 在网上搜索了一下,找到了一个解决方法:把"C:\Progr ...

  5. JS版汉字与拼音互转终极方案,附简单的JS拼音

    前言 网上关于JS实现汉字和拼音互转的文章很多,但是比较杂乱,都是互相抄来抄去,而且有的不支持多音字,有的不支持声调,有的字典文件太大,还比如有时候我仅仅是需要获取汉字拼音首字母却要引入200kb的字 ...

  6. 使用charles远程调试iOS移动应用

    做iOS移动应用很多开发者会喜欢抓网络发包.回包来联调服务端借口以及定位其他网络问 题.如果在Windows系统可以使用fiddler来做iOS的远程代理,只要fiddler所在系统与iOS设备同时连 ...

  7. 判断vps类型

  8. nginx rewrite arg 带问号的地址转发参数处理?Nginx重定向的参数问题

    Nginx重定向的参数问题 在给某网站写rewrite重定向规则时,碰到了这个关于重定向的参数处理问题.默认的情况下,Nginx在进行rewrite后都会自动添加上旧地址中的参数部分,而这对于重定向到 ...

  9. hibernate save update merge 区别

    1.save save的对象是临时对象,首先将对象写入缓存,使其变为持久对象. save函数底层使用的是Insert语句,因此如果数据库中已经存在相同ID的记录,那么会报错 2.update upda ...

  10. 服务器启动之后运行脚本在/etc/rc.d/rc.local中配置

    服务器启动之后运行脚本在/etc/rc.d/rc.local中配置 # ! /bin/sh # 启动svn /usr/bin/svnserve -d -r /var/svnroot/