sql解决问题思路

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql解决问题思路相关的知识,希望对你有一定的参考价值。

参考技术A

Not IN

Example:
查询没学过"张三"老师授课的同学的信息

IN + NOT IN

Example:
查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息

NOT IN + NOT IN

Example:
查询和"01"号的同学学习的课程完全相同的其他同学的信息

这部分就表示图中 2,4

这部分表示图中1,3,所以最后分组求和判断课程数相同就得到完全一致的。
这题用正向的思维是,不好做的。总是会出现部分相同,使用这种反向双重否定的方式去处理“完全”这种sql最好

case when ...then .... else .....end

Example:
显示所有学生的所有课程的成绩以及平均成绩,按平均成绩从高到低排序

Sum(condition)

Example:
查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
-- 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90

Example:
按各科成绩进行排序,并显示排名

思想:首先排序好,那么从第一个开始比较,不相等就加+,最后数字就是排名

结果

思路:先排名然后筛选即可
Example:

去重方式:distinct or group by
思路:自关联+使用条件+NOT IN
多字段交叉去重

使用函数:
week() year() day() month() now() datediff()

Example:
查询各学生的年龄

查询下周过生日的学生

写sql,多使用函数,如果普通思维完成不了使用集合逆向求反的思维

sql--CONVERTFOR XML PATH解决实际问题

原文:sql--CONVERT、FOR XML PATH解决实际问题

 

需求:每个平台分类下的门店,每个门店的名称、图片路径、评分,每个门店下的四个产品的名称、图片路径、评分

技术分享图片

思路:

一开始门店动态化好写,用Ajax就行了。但是每个门店下面的产品,每个去请求一次查询有点不太现实。

一开始准备用每个门店的Id去发起请求,被自己蠢哭了。

在换个思路用sql语句吧

同时把这么多数据一把查出来。

技术分享图片

 

 

 就是把这两张表拼成一张表,把数据作为一行数据在用符号分割,前台在取出来。

 WITH    td
          AS ( SELECT   Hishop_Stores.StoreId ,
                        Hishop_Stores.StoreName ,
                        Hishop_Products.FirstraceScore ,
                        Hishop_Products.StoreId AS id ,
                        Hishop_Products.ProductName ,
                        Hishop_Products.ImageUrl1
               FROM     ( SELECT    StoreId ,
                                    StoreName ,
                                                                        StoreImages,
                                    FirstraceScore
                          FROM      Hishop_Stores
                        ) AS Hishop_Stores
                        LEFT JOIN ( SELECT  StoreId ,
                                            ProductName ,
                                            FirstraceScore ,
                                            ImageUrl1
                                    FROM    Hishop_Products
                                    WHERE   ProductName IS NOT NULL
                                  ) AS Hishop_Products ON Hishop_Stores.StoreId = Hishop_Products.StoreId
             )
    SELECT  B.StoreId ,
            B.StoreName ,
            B.FirstraceScore ,
                        B.StoreImages,
            ( SELECT    CONVERT(VARCHAR(100), td.ProductName) + |
                        + CONVERT(VARCHAR(100), ISNULL(td.FirstraceScore, 0))
                        + | + CONVERT(VARCHAR(100), ISNULL(td.ImageUrl1, ))
                        + =
              FROM      td
              WHERE     td.StoreId = B.StoreId
              ORDER BY  td.FirstraceScore DESC
            FOR
              XML PATH(‘‘)
            ) AS ProductList
    FROM    Hishop_Stores B
        where ShopTypeId=10
    GROUP BY StoreId ,
            StoreName ,
                        StoreImages,
            B.FirstraceScore;
    --ORDER BY B.FirstraceScore DESC;

 

结果:

技术分享图片

OK

其中用到了CONVERT来转换格式,FOR XML PATH(‘‘)来实现行转列。

最后Ajax

$(function () {
       var shopTypeId = getParam(‘shopTypeId‘);
        $.ajax({
            type: "post", url: "/API/StoreProductAJAX.ashx", data: { action: ‘storelist‘,shopTypeId:shopTypeId },
              async: false,
            success: function (data)
            {
                           
                 for (var i = 0; i < data.length; i++)
                 {
                     var msg = data[i];
                     var score = msg.FirstraceScore;
                     var name = msg.StoreName;
                     var list = msg.ProductList;
                     
                     var strs = new Array(); //定义一数组
                     var strsnew = new Array(); //定义一数组
                     var strlist = new Array();
                     strs=list.split("="); //字符分割
                      for (ii = 0; ii < strs.length; ii++)
                      {
                          strsnew = strs[ii].split("|"); //字符分割
                           for (j = 0; j < strsnew.length; j++)
                            {
                               strlist.push(strsnew[j]);
                              
                            }
                      //document.write(strs[i] + "<br/>"); //分割后的字符输出
                     }
                     //document.write( strlist+ "<br/>"); //分割后的字符输出
                     //alert(strsnew);
                     //if (name == "")
                     //{
                     //    continue;
                     //}

                     if (score == 0)
                     {
                         if (strlist[0] == "")
                         {
                             $("#store").append($(‘ <div class="list-lump border-t" id="‘ + msg.StoreId + ‘"><dl class="border-b"><dt><em><img src="‘+msg.StoreImages+‘" onerror="this.src=‘/Storage/master/depot/img-1.jpg‘"></em></dt><dd><span class="list-n1">‘ + msg.StoreName + ‘</span><a href="/vShop/StoreProductList?storeId=‘ + msg.StoreId + ‘">进店逛逛</a></dd></dl><ul class="clearfix border-b" id="product"> </li></ul></div>‘));
                              continue;
                         }
。。。。

这边感觉自己写的有点蠢  不知道怎么去分割输出比较好


以上是关于sql解决问题思路的主要内容,如果未能解决你的问题,请参考以下文章

sql--CONVERTFOR XML PATH解决实际问题

关于php高并发解决的一点思路

关于php 高并发解决的一点思路

sql--CONVERTFOR XML PATH解决实际问题

MySQL监控与慢SQL解决思路

SQL SERVER - 谈死锁的监控分析解决思路