S关于使用QL声明 找出同时满足多个tag拍摄条件设置算法
表结构
Tag Table:{tag_id, tag_name} #标签表
News Table:{news_id, title,......} #新闻列表
NewsTags Table:{tag_id, news_id} #新闻的标签关系表
解释:
一条新闻,有多个tag标签,比如:
新闻a{Tag1,Tag2, Tag3, Tag4}
新闻b{Tag1,Tag6, Tag7, Tag8}
新闻c{Tag8,Tag9, Tag10, Tag1}
新闻...{Tag..., .....}
搜索出 同一时候有Tag1,Tag8两个标签的记录。
在MySQL中经过优化后的SQL:
SELECT News.title
FROM(
SELECT news_id
FROM (
SELECT tag_id
FROM Tag
WHERE tag_name IN('Tag1', 'Tag8')
)B LEFT JOIN NewsTags C (B.tag_id = C.tag_id)
GROUP BY news_id
HAVING COUNT(0)=2
)A LEFTJOIN News B ON(A.news_id = B.news_id)
原理:
此为3重嵌套SQL,可最大限度的高速缩小记录集。以最节省内存的方式得到结果集。
1、最内层取出须要比对的tag_id
2、第二层通过Left join联接,找出同一时候拥有这些tag_id的news_id记录;本处理的重点是对news_id做Group by然后在Having中统计出数量为2的news_id(即:同一时候存在这两个tag的记录)
3、最外层依据news_id(这个已经是终于的最小记录集),与News表Left Join求出新闻记录的内容
至此可得到 同一时候符合 多个Tag名称 的记录集的模板,依据查找的tag数量不同。需在最内层的IN(),与第二层的Having做參数改动就可实现对随意数量的Tag交集求解。
此算法并不是最优。可是假设想通过模板方式的一条SQL来实现,基本上这个算是最优的算法(本人愚见哈)。
这个算法的缺点是。假设每一个tag相应的记录集数量巨大,且给了非常多个Tag求交集。那么第二层的LeftJoin运算会消耗大量的内存空间(由于须要对每一个tag_id生成一个news_id的集合。实际上会先得到一个笛卡尔集,然后对这个集合做group,再count)。
假设想把效率与搜索内存资源消耗做极致大致。可做例如以下改动,思路例如以下。
1、改造Tag表,添加一个被引用的数量字段。比如:Tag Table:{tag_id, tag_name, links} (事实上能够把links看成一个人工索引)
2、维护这样的Tag表比較麻烦。考虑到效率。通常会定时的对links字段做全表更新(对于频繁插入或删除记录的news表。可每天临晨,对全记录集的tag做被引用的次数统计并更新links字段)
3、构造动态多层嵌套的SQL语句(即依据tag的数量,生成N层嵌套查询)
实现原理(SQL语句就不写了)
1、依据给定的tag_name找出tag_id,并按对links大小,升序排列
2、首先选取第一个tag_id到NewsTags表求NewsTags.tag_id的交集(此为最小基本记录集)得到news_id,然后对此记录集反复运行这个步骤(逐步缩小记录集),完毕全部tags的比对时就能在最小的范围内找出全部同一时候符合这些tag_id的记录集。
这个算法的核心就是第一次要得到最小的记录集(也许保存为了最大化比对的数目),然后逐步将记录集变小,直到对准完成。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
S关于使用QL声明 找出同时满足多个tag拍摄条件设置算法的更多相关文章
- 【原创】Matlab.NET混合编程技巧之找出Matlab内置函数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 Matlab与.N ...
- 排序练习——找出前m大的数字 分类: 排序 2015-06-08 09:33 21人阅读 评论(0) 收藏
排序练习--找出前m大的数字 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 给定n个数字,找出前m大的数字. 输入 多组输 ...
- Matlab.NET混编技巧之——找出Matlab内置函数
原文 http://www.cnblogs.com/asxinyu/p/3295309.html Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯 定不难.反之,有时 ...
- [LeetCode]Palindrome Partitioning 找出所有可能的组合回文
给定一个字符串,切割字符串,这样每个子字符串是一个回文字符串. 要找出所有可能的组合. 办法:暴力搜索+回溯 class Solution { public: int *b,n; vector< ...
- 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 print-all-combinations-of-given-length
// 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 /* Input: set[] = {'a', 'b'}, k = 3 Output: aaa aab aba ...
- 例如找出令人信服的权威C++中间malloc与new
例如找出令人信服的权威C++中间malloc与new 问题: 非常多人都知道malloc与new都是用来申请空间用的,开辟空间来源于堆中. 可是在C++中却非常少用malloc去申请空间,为什么? 以 ...
- Matlab.NET混合编程技巧之——找出Matlab内置函数
原文:[原创]Matlab.NET混合编程技巧之--找出Matlab内置函数 Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯定不难.反之,有时候一个小错误,可能抓破 ...
- Class 找出一个整形数组中的元素的最大值
目的:找出一个整形数组中的元素的最大值 以下,我们用类和对象的方法来做. #include<iostream> using namespace std; class Array_m ...
- 函数内this指向+排序+找出数组大小项+Math类
解决函数内this指向: 1,可以在函数外提前声明变量 _this/that = this 2,通过apply()和call()来修改函数内的this指向 二者区别: 用法是一样的,参数形式不一样 f ...
随机推荐
- 第五章_JSTL
5.1.下载JSTL http://jstl.java.net 5.2.JSTL类库 类别 下属功能 URI 前缀 Core 变量支持 http://java.sun.com/jsp/jstl/cor ...
- RPC模式的Hub操作
signalR 专题—— 第四篇 模拟RPC模式的Hub操作 在之前的文章中,我们使用的都是持久连接,但是使用持久连接的话,这种模拟socket的形式使用起来还是很不方便的,比如只有一个唯一的 O ...
- C语言cgi(1)
1Columbia Universitycs3157 – Advanced ProgrammingSummer 2014, Lab #2, 60ish pointsJune 9, 2014Follow ...
- msyql在查询字段中的所有记录,不重复
mysql> select * from a ; +----+------+--------------+ | id | name | descri | +----+------+ ...
- android CountDownTimer
最近进行的项目使用的定时功能,我发现了一个非常容易使用内置类CountDownTimer.当然,可以使用这种效果TimerTask + Timer为了实现.只是我个人的意见CountDownTimer ...
- Asp.net网站的简单发布
概述 网站是由一个个页面组成的,是万维网具体的变现形式,关于万维网,网页的方面的理论知识,大家可以看一看这篇博客:万维网文档,在这里就不多说了.网站的发布要到达的一个目的就是,别人可以通过浏览器访问该 ...
- shell程序之逐行读取一文件里的參数且使用此參数每次运行5分钟
/********************************************************************* * Author : Samson * Date ...
- FileStream:The process cannot access the file because it is being used by another process
先看下面一段代码(先以共享的方式打开文件读写,然后以只读的方式打开相同文件): FileStream fs = new FileStream(filePath, FileMode.Open, Fil ...
- WPF绘制党徽(立体效果,Cool)
原文:WPF绘制党徽(立体效果,Cool) 前面用WPF方式绘制了党旗(WPF制作的党旗) ,去年3月份利用C# 及GDI+绘制过党徽,这次使用WPF来绘制党徽. ------------------ ...
- C++ Primer 学习笔记_45_STL实践与分析(19)--建筑常规算法
STL实践与分析 --泛型算法的结构 引言: 正如全部的容器都建立在一致的设计模式上一样,算法也具有共同的设计基础. 算法最主要的性质是须要使用的迭代器种类.全部算法都指定了它的每一个迭代器形參可使用 ...