mysql的交集与差集

在论坛看到的一个问题这里总结下: 
CREATE TABLE consume ( 
id VARCHAR(11) NOT NULL, 
tid VARCHAR(11) NOT NULL 

COLLATE=’utf8_general_ci’ 
ENGINE=MyISAM 

INSERT INTO consume (idtid) VALUES (‘1’, ‘11’); 
INSERT INTO consume (idtid) VALUES (‘2’, ‘14’); 
INSERT INTO consume (idtid) VALUES (‘3’, ‘12’);

CREATE TABLE teacher ( 
id VARCHAR(11) NOT NULL, 
tname VARCHAR(11) NOT NULL, 
tdate DATETIME NOT NULL 

COLLATE=’utf8_general_ci’ 
ENGINE=MyISAM 

INSERT INTO teacher (idtnametdate) VALUES (‘10’, ‘李老师’, ‘2008-01-22 21:54:27’); 
INSERT INTO teacher (idtnametdate) VALUES (‘11’, ‘支老师’, ‘2008-01-21 21:54:27’); 
INSERT INTO teacher (idtnametdate) VALUES (‘13’, ‘宋老师’, ‘2008-01-28 21:54:27’); 
INSERT INTO teacher (idtnametdate) VALUES (‘14’, ‘魏老师’, ‘2008-01-29 21:54:27’); 
INSERT INTO teacher (idtnametdate) VALUES (‘15’, ‘金老师 ‘, ‘2008-01-30 21:54:27’); 
INSERT INTO teacher (idtnametdate) VALUES (‘16’, ‘赵老师’, ‘2008-01-19 21:54:27’); 
INSERT INTO teacher (idtnametdate) VALUES (‘17’, ‘张老师’, ‘2008-01-18 21:54:27’); 
INSERT INTO teacher (idtnametdate) VALUES (‘18’, ‘严老师’, ‘2008-01-17 21:54:27’); 
INSERT INTO teacher (idtnametdate) VALUES (‘12’, ‘龚老师’, ‘2008-01-25 21:54:27’); 
INSERT INTO teacher (idtnametdate) VALUES (‘19’, ‘刘老师 ‘, ‘2008-01-17 21:34:27’);

求 
如果teacher中的id在consume中的tid中有,就排在前面,没有就排在后面 
对于排在前面的又按照consume中的id升序排 
对于排在后面的,按teacher中的tdate的降序排序

对于这个其实分拆出来: 
1、teacher中的id在consume中的tid中有按照consume中的id升序排 
select t.* from teacher t join consume c on c.tid= t.id order by c.id asc 
2、teacher中的id在consume中的tid中没有按teacher中的tdate的降序排序 
select t.* from teacher t left join consume c on c.tid= t.id where c.id is NULL order by tdate desc 
然后将两张表连起来 
select * from (select t.* from teacher t join consume c on c.tid= t.id order by c.id asc)b 
union 
select * from (select t.* from teacher t left join consume c on c.tid= t.id where c.id is NULL order by tdate desc)a

 
这里说明下2中这个求法 
 
就像这两幅图,从数据看更像第一张图 
首先left join 可以找到所有的teacher表的数据(select * from teacher t left join consume c on c.tid= t.id order by tdate desc),如图 
 
这里可以看到我们只需要的是id没有数据的部分,所以在left join 后加个条件c.id is NULL即可得到这个差集 
类似第一张图 
那现在怎样得到第二张图,这里其实是一样的,因为left join能够得到的数据是teacher表的全部数据如图 
 
所以我在剔除掉交集的那部分即可(c.id is not NULL),所以还是在left join 后加个条件c.id is NULL即可得到这个差集类似第二张图 
以上是我的交集与差集的理解。 
参考:http://blog.itpub.net/29510932/viewspace-1777673/ 
http://blog.csdn.net/youngqj/article/details/7225400

时间: 2024-12-28 18:05:06

mysql的交集与差集的相关文章

mysql获取两个集合的交集和差集

mysql中获取两个集合的交集,我的方法如下: 1.两个集合的结构要一致,对应的字段数,字段类型 2.将两个集合用 UNION ALL 关键字合并,这里的结果是有重复的所有集 3.将上面的所有集 GROUP BY id 4.最后 HAVING COUNT(id)=1,等于1的意思是只出现了一次,所以这个是差集,如果等于2,那么就是交集 这是实现的基本原理,具体如下: 1 -- 下面的sql有明显的问题,不过这个只是一个示意,从一个表中查询不需要用到交集和差集,条件可以合并在一起直接查询出来的.能

Linux comm命令求出文件的交集、差集

A(1,2,3)和B(3,4,5),A和B的交集是3,A对B的差集是1和2,B对A的差集是4和5,A和B求差的结果是1.2.4.5. 在Linux中可以使用comm命令求出这些集. [[email protected] tmp]# cat <<eof>set1.txt > orange > gold > apple > sliver > steel > iron > eof [[email protected] tmp]# cat <<

利用sort和uniq求两个文件的并集,交集和差集

利用sort和uniq求两个文件的并集,交集和差集 并集:cat file1.txt file2.txt | sort | uniq > file.txt 交集:cat file1.txt file2.txt | sort | uniq -d >file.txt 差集:求file1.txt相对于file2.txt的差集,可先求出两者的交集file3.txt,然后在file1.txt中除去file3.txt即可. cat file1.txt file2.txt | sort | uniq -d

linux_coom _ Linux文件比较,文本文件的交集、差集与求差

交集和差集操作在集合论相关的数学课上经常用到,不过,在Linux下 对文本进行类似的操作在某些情况下也很有用. comm命令 comm命令可以用于两个文件之间的 比较,它有一些选项可以用来调整输出,以便执行交集.求差.以及差集操作. 交集:打印出两个文件所共有的行. 求差:打印出指定文件所包含的且不相同的行. 差集:打印出包含在一个文件中,但不包含在其他指定文件中的行. [[email protected] text]# cat aaa.txt aaabbbcccdddeee111222 [[e

Python 获取Twitter用户与Friends和Followers的关系(eg, 交集,差集)

CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-7-30 @author: guaguastd @name: friends_followers_analyzer.py ''' if __name__ == '__main__': # import json #import json # import search from search import search_for_tweet # import ge

JAVA获取两个数据量较大的ArrayList的交集、差集以及并集

测试说明:获取firstArrayList和secondArrayList的交集.差集以及并集.实际测试中firstArrayList数据量190000,secondArrayList数据量170000.效率比较高.此处只列出少量数据.测试代码如下: import java.util.Set; import java.util.List; import java.util.HashSet; import java.util.TreeSet; import java.util.Iterator;

第二十二章 Linux文件比较,文本文件的交集、差集与求差:comm命令

第二十二章 Linux文件比较,文本文件的交集.差集与求差:comm命令 名词解释 comm 命令 可以用于两个文件之间的比较,它有一些选项可以用来调整输出,以便执行交集.求差.差集操作. 交集:打印两个文件所共有的行 求差:打印出指定文件所包含的其不相同的行. 差集:打印出包含在一个文件中,但不包含在其他指定文件中的行. 语法 comm(选项)(参数) 选项 -1 :不显示在第一个文件出现的内容: -2 :不显示在第二个文件中出现的内容: -3 :不显示同时在两个文件中都出现的内容. ? 参数

Python 求两个文本文件以行为单位的交集 并集 差集

Python 求两个文本文件以行为单位的交集 并集 差集,来代码: s1 = set(open('a.txt','r').readlines()) s2 = set(open('b.txt','r').readlines()) print 'ins: %s'%(s1.intersection(s2)) print 'uni: %s'%(s1.union(s2)) print 'dif: %s'%(s1.difference(s2).union(s2.difference(s1))) 原文地址:h

(一)Python入门-3序列:19集合-特点-创建和删除-交集并集差集运算

集合: 集合是无序可变,元素不能重复.实际上,集合底层是字典实现,集合的所有元素都是字典 中的“键对象”,因此是不能重复的且唯一的. 一:集合的创建和删除 1. 使用{}创建集合对象,并使用 add()方法添加元素 1 >>> a = {1,3,5} 2 >>> a 3 {1, 3, 5} 4 >>> a.add(7) 5 >>> a 6 {1, 3, 5, 7} 7 >>> a.add(5) 8 >>&