查询问题

zhanglong_longlong 2015-06-03 10:41:16
比如我有个文章表Table1,他里面有字段title, 我想根据我输入的几个关键词去查询出他匹配的title的文章列表,

比如我要10条数据,我输入关键词:AA,BB这2个关键词,我就优先查到包含这2个关键词的title数据,如果没有就查BB,AA的title,如果在没有就直接查包含AA的,在没有就BB,依次类推凑满10条数据
...全文
67639 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhanglong_longlong 2015-06-03
  • 打赏
  • 举报
回复
引用 15 楼 starfd 的回复:
在外部再用select top 10 * from (xxx) t包含下,每个select本身带top 10 我这个都是馊主意……
好的,明白了
  • 打赏
  • 举报
回复
在外部再用select top 10 * from (xxx) t包含下,每个select本身带top 10 我这个都是馊主意……
zhanglong_longlong 2015-06-03
  • 打赏
  • 举报
回复
引用 13 楼 starfd 的回复:
而且不用like的话你这种做法也很不合理 比如数据库是 AA YY CC BB EE GG 你用AA CC来查,要查到这个记录,只能是AA或者CC查出来,其实AA CC用like的话已经能查出来了
Top10应该写在哪里?
  • 打赏
  • 举报
回复
而且不用like的话你这种做法也很不合理 比如数据库是 AA YY CC BB EE GG 你用AA CC来查,要查到这个记录,只能是AA或者CC查出来,其实AA CC用like的话已经能查出来了
  • 打赏
  • 举报
回复
按你这种数据库设计方法,高不起来吧…… 要不你找DBA咨询下有没有更好的办法?
zhanglong_longlong 2015-06-03
  • 打赏
  • 举报
回复
引用 10 楼 starfd 的回复:
就是你的关键字不是子表存的,而是用一个字符串存的,然后你为此要组合出可能的组合方式拼接成一个字符串,然后通过sql查询出来,是这样的意思吗?你现在主要的问题难点是在组合部分还是sql部分,sql部分就我上面哪种思路改改,或者都不需要那么麻烦,直接用title = "AA BB CC" or title = "AA CC BB "就行了
是你那个意思,有效率高点的方法吗
  • 打赏
  • 举报
回复
就是你的关键字不是子表存的,而是用一个字符串存的,然后你为此要组合出可能的组合方式拼接成一个字符串,然后通过sql查询出来,是这样的意思吗?你现在主要的问题难点是在组合部分还是sql部分,sql部分就我上面哪种思路改改,或者都不需要那么麻烦,直接用title = "AA BB CC" or title = "AA CC BB "就行了
zhanglong_longlong 2015-06-03
  • 打赏
  • 举报
回复
引用 8 楼 starfd 的回复:
我没想到过用分词…… 我这个只是按常规思路考虑的…… 然后你说不是需求说的那样……那是哪样?
比如我文本框输入了3个关键词 这里就用逗号分隔吧:文本框关键词是:AA BB CC 这里我就先查询title列包含这3个关键词的10条数据,如果没有10条,或者没有数据,就查询AA CC BB 没有在查询 BB AA CC这样,以此类推。。。。
  • 打赏
  • 举报
回复
我没想到过用分词…… 我这个只是按常规思路考虑的…… 然后你说不是需求说的那样……那是哪样?
zhanglong_longlong 2015-06-03
  • 打赏
  • 举报
回复
比如我文本框输入了3个关键词 这里就用逗号分隔吧:文本框关键词是:AA BB CC 这里我就先查询title列包含这3个关键词的10条数据,如果没有10条,或者没有数据,就查询AA CC BB 没有在查询 BB AA CC这样,以此类推。。。。
zhanglong_longlong 2015-06-03
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
你这个估计得在程序里面拼接SQL啊 感觉你这个就是要获取各种组合,组合哪块怎么获取我就不写了,下面的只能说是个伪代码,具体就是描述思路,通过union拼接sql,然后外部用个top10获取下,当然如果程序拼接不是很靠谱的话,也可以将这部分逻辑写入存储过程
List<string[]> list = new List<string[]>()
            {   new string[]{"AA","BB"} ,
                //new string[]{"BB","AA"} ,话说这样在数据库里不是一样的么,like查询时
                new string[]{"BB"} ,
                new string[]{"BB"} ,
            };
            StringBuilder sql = new StringBuilder();
            foreach (var arr in list)
            {
                if (sql.Length > 0)
                {
                    sql.AppendLine("union");
                }
                sql.Append("select * from table where ");
                for (var i = 0; i < arr.Length; i++)
                {
                    if (i > 0)
                    {
                        sql.Append(" And ");
                    }
                    sql.Append(" title like %'" + arr[i] + "%'");
                }
            }
不是需求说的那样
於黾 2015-06-03
  • 打赏
  • 举报
回复
没看懂什么规则
zhanglong_longlong 2015-06-03
  • 打赏
  • 举报
回复
我这个是有规则的,用这个不行的
  • 打赏
  • 举报
回复
你这个估计得在程序里面拼接SQL啊 感觉你这个就是要获取各种组合,组合哪块怎么获取我就不写了,下面的只能说是个伪代码,具体就是描述思路,通过union拼接sql,然后外部用个top10获取下,当然如果程序拼接不是很靠谱的话,也可以将这部分逻辑写入存储过程
List<string[]> list = new List<string[]>()
            {   new string[]{"AA","BB"} ,
                //new string[]{"BB","AA"} ,话说这样在数据库里不是一样的么,like查询时
                new string[]{"BB"} ,
                new string[]{"BB"} ,
            };
            StringBuilder sql = new StringBuilder();
            foreach (var arr in list)
            {
                if (sql.Length > 0)
                {
                    sql.AppendLine("union");
                }
                sql.Append("select * from table where ");
                for (var i = 0; i < arr.Length; i++)
                {
                    if (i > 0)
                    {
                        sql.Append(" And ");
                    }
                    sql.Append(" title like %'" + arr[i] + "%'");
                }
            }
无爱大叔 2015-06-03
  • 打赏
  • 举报
回复
这个涉及到全文检索的分词规则了,找个全文检索如lucene.net研究一下吧
还想懒够 2015-06-03
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
直接肯定不行的啊 ab!=ba这个你我都知道,我给你copy的有IEqualityComparer<TSource> comparer,你要实现这个接口 内部比较方法也很简单的,Console.WriteLine("ab".SequenceEqual("ba".OrderBy(x=>x)));
zhanglong_longlong 2015-06-03
  • 打赏
  • 举报
回复
引用 18 楼 starfd 的回复:
在结果集合中过滤吧
//
        // 摘要: 
        //     通过使用指定的 System.Collections.Generic.IEqualityComparer<T> 对值进行比较返回序列中的非重复元素。
        //
        // 参数: 
        //   source:
        //     要从中移除重复元素的序列。
        //
        //   comparer:
        //     用于比较值的 System.Collections.Generic.IEqualityComparer<T>。
        //
        // 类型参数: 
        //   TSource:
        //     source 中的元素的类型。
        //
        // 返回结果: 
        //     一个 System.Collections.Generic.IEnumerable<T>,包含源序列中的非重复元素。
        //
        // 异常: 
        //   System.ArgumentNullException:
        //     source 为 null。
        public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer);
他的结果是ab ba 这样怎么Distinct
  • 打赏
  • 举报
回复
在结果集合中过滤吧
//
        // 摘要: 
        //     通过使用指定的 System.Collections.Generic.IEqualityComparer<T> 对值进行比较返回序列中的非重复元素。
        //
        // 参数: 
        //   source:
        //     要从中移除重复元素的序列。
        //
        //   comparer:
        //     用于比较值的 System.Collections.Generic.IEqualityComparer<T>。
        //
        // 类型参数: 
        //   TSource:
        //     source 中的元素的类型。
        //
        // 返回结果: 
        //     一个 System.Collections.Generic.IEnumerable<T>,包含源序列中的非重复元素。
        //
        // 异常: 
        //   System.ArgumentNullException:
        //     source 为 null。
        public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer);
zhanglong_longlong 2015-06-03
  • 打赏
  • 举报
回复
 class Program
    {
        static void Main(string[] args)
        {
            List<string> list = new List<string>() { "a", "b", "c" };
            bind(list, new List<string>(), 1);
            Console.ReadLine();
        }
        private static void bind(List<string> list, List<string> source, int count)
        {
            if (source.Count <= count)
            {
                if (source.Count > 1)
                    Write(source);
            }
            for (int i = 0; i < list.Count; i++)
            {
                if (source.Contains(list[i].Trim()))
                    continue;
                source.Add(list[i]);
                bind(list, source, count + 1);
                source.Remove(list[i]);
            }
        }
        private static void Write(List<string> List)
        {
            for (int i = 0; i < List.Count; i++)
            {
                Console.Write(List[i]);
            }
            Console.Write("\n");
        }
    }
这样的结果是:这样的结果会有ab ba , abc cba这样的结果,这样要怎么把它有ab 就不给他ba,有abc 就不给他cba 和bca之类的

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧