我打算做这样一个功能,很多网站都有的。  比如:我查看了一个具体的产品信息。在它的旁边出现:  跟它类型相似的产品列表;
  跟它价格相似的产品列表;
  ……
请高手能告诉我一个基本思路(包括数据库设计方面),有具体的方法会更好。参与有份,不停地顶,不得到满意答案誓不罢休!呵呵。。

解决方案 »

  1.   

    vs 2003里用datalist,加链接看产品明细.
      

  2.   

    cookie来做.下面给个类给你,不过存储的是图片路径,产品id和查看时间,你把图片根据你代码该为产品名称,然后修改下html代码就可以了
    namespace CookieDataInfo
    {
        using System;
        using System.Web;
        using System.Collections;
        /// <summary>
        /// 数据结构类型
        /// </summary>
        public class DataInfo
        {
            private string m_ViewPic;
            private string m_ATID;
            private string m_CountryID;
            private string m_ATName;
            private DateTime m_ViewTime;
            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="ViewPic">预浏图片名称</param>
            /// <param name="ATID">景点id</param>
            /// <param name="CountryID">国家id</param>
            /// <param name="ATName">景点名称</param>
            public DataInfo(string ViewPic, string ATID, string CountryID,string ATName)
            {
                m_ViewPic = ViewPic;
                m_ATID = ATID;
                m_CountryID = CountryID;
                m_ATName = ATName;
                m_ViewTime = DateTime.Now;
            }
            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="ViewPic">预浏图片名称</param>
            /// <param name="ATID">景点id</param>
            /// <param name="CountryID">国家id</param>
            /// <param name="ViewTime">查看时间</param>
            /// <param name="ATName">景点名称</param>
            public DataInfo(string ViewPic, string ATID, string CountryID, string ATName, DateTime ViewTime)
            {
                m_ViewPic = ViewPic;
                m_ATID = ATID;
                m_CountryID = CountryID;
                m_ATName = ATName;
                m_ViewTime = ViewTime;
            }
            /// <summary>
            /// 预浏图片名称
            /// </summary>
            public string ViewPic
            {
                get { return m_ViewPic; }
                set { m_ViewPic = value; }
            }
            /// <summary>
            /// 景点id
            /// </summary>
            public string ATID
            {
                get { return m_ATID; }
                set { m_ATID = value; }
            }
            /// <summary>
            /// 国家id
            /// </summary>
            public string CountryID
            {
                get { return m_CountryID; }
                set { m_CountryID = value; }
            }
            /// <summary>
            /// 景点名称
            /// </summary>
            public string ATName
            {
                get { return m_ATName; }
                set { m_ATName = value; }
            }
            /// <summary>
            /// 浏览时间
            /// </summary>
            public DateTime ViewTime
            {
                get { return m_ViewTime; }
                set { m_ViewTime = value; }
            }
        }    /// <summary>
        /// cookie操作类
        /// </summary>
        public class CookieOp
        {
            private static int m_MaxCount = 6;
            private static ArrayList m_Arr;
            static CookieOp()
            {
                m_Arr = new ArrayList();
                if (HttpContext.Current.Request.Cookies["recentview"] != null && HttpContext.Current.Request.Cookies["recentview"].Value != "")
                {
                    string Data = HttpUtility.UrlDecode((HttpContext.Current.Request.Cookies["recentview"].Value + "").Trim());
                    if (Data != "")
                    {
                        string[] ds = Data.Split('|');
                        string[] di;
                        DataInfo d;
                        for (int i = 0; i < ds.Length; i++)
                        {
                            di = ds[i].Split(',');
                            d = new DataInfo(di[0], di[1], di[2],di[4], DateTime.Parse(di[3]));
                            m_Arr.Add(d);
                        }
                    }
                }
            }
            /// <summary>
            /// 最近浏览景点的数组
            /// </summary>
            public static ArrayList Arr
            {
                get 
                {
                    //如果多于2条记录则先按时间排序排序
                    if(m_Arr.Count>1)
                        m_Arr.Sort(new SortByTime());
                    return m_Arr; 
                }
            }
            /// <summary>
            /// 显示最近浏览的数量,最默认为6条
            /// </summary>
            public static int MaxCount
            {
                get { return m_MaxCount; }
                set { m_MaxCount = value; }
            }
            /// <summary>
            /// 添加当前浏览的景点
            /// </summary>
            /// <param name="d">景点数据对象</param>
            public static void Add(DataInfo d)
            {
                DataInfo di = GetContainObj(d.ATID);
                if (di == null)
                {
                    if (m_Arr.Count < MaxCount)
                        m_Arr.Add(d);
                    else
                    {
                        m_Arr.Sort(new SortByTime());//先排序
                        m_Arr.RemoveAt(MaxCount - 1);//排序完后删除最后一条记录
                        m_Arr.Add(d);
                    }
                }
                else
                    di.ViewTime = d.ViewTime;//更新数据
            }
            /// <summary>
            /// 添加当前浏览的景点
            /// </summary>
            /// <param name="ViewPic">预浏图片名称,不包含路径</param>
            /// <param name="ATID">景点id</param>
            /// <param name="CountryID">国家id</param>
            /// <param name="ATName">景点名称</param>
            public static void Add(string ViewPic, string ATID, string CountryID, string ATName)
            {
                DataInfo d = new DataInfo(ViewPic, ATID, CountryID, ATName, DateTime.Now);
                Add(d);
            }
            private static DataInfo GetContainObj(string ATID)
            {
                foreach (DataInfo di in m_Arr)
                {
                    if (di.ATID == ATID)
                        return di;
                }
                return null;
            }
            /// <summary>
            /// 把数组对象转换为字符串
            /// </summary>
            /// <returns></returns>
            public static new string ToString()
            {
                string Data = "";
                foreach (DataInfo di in m_Arr)
                {
                    Data += di.ViewPic + "," + di.ATID + "," + di.CountryID + ","
                        + di.ViewTime.ToString() + "," + di.ATName.Replace(",", "").Replace("'", "") + "|";
                }
                if (Data.EndsWith("|"))
                    Data = Data.Trim(new char[] { '|'});
                return HttpUtility.UrlEncode(Data);
            }
            /// <summary>
            /// 保存cookie
            /// </summary>
            public static void Save()
            {
                HttpCookie hc = new HttpCookie("recentview", CookieOp.ToString());
                hc.Expires = DateTime.Now.AddYears(1);
                HttpContext.Current.Response.Cookies.Add(hc);
            }
        }
        /// <summary>
        /// 按时间比较接口
        /// </summary>
        public class SortByTime : IComparer
        {
            #region IComparer 成员
            /// <summary>
            /// 按时间比较,从新到旧
            /// </summary>
            /// <param name="x">对象1</param>
            /// <param name="y">对象2</param>
            /// <returns>比较结果</returns>
            public int Compare(object x, object y)
            {
                DataInfo dx = (DataInfo)x;
                DataInfo dy = (DataInfo)y;
                if (dx.ViewTime > dy.ViewTime)
                    return -1;
                else if (dx.ViewTime < dy.ViewTime)
                    return 1;
                else
                    return 0;
            }
            #endregion
        }
    }
      

  3.   

    创临时表吧``找到类型,价格相近的产品,然后select .....
      

  4.   

    谢谢各位。to 2 楼:你可能还没理解我的意思。
    to 3 楼:你给我代码我还没明白意思。
    to 4 楼:基恩上懂了,开始我查看的产品是随机的,也就是说在它旁边的一系列列表是动态实现的。 应该怎么去做呢?
      

  5.   

    你产品要有关键字,然后再利用关键字的SQL  Like去匹配出来一个DataSet,然后在绑定到页面
    这是最原始的方法
      

  6.   

    既然是动态的 就动态的查呗
    跟它类型相似的产品列表  -------- Select * From ProTable Where Type = @thistype 
    跟它价格相似的产品列表  -------- Select * From ProTable Where Price > @thisprice - 100 Or Price < @thisprice + 100
      

  7.   

    确实,不用ajax的话就要首先从数据库中把相关记录取出来
      

  8.   

    不管你的产品信息是以什么形式显示的 都可以取得这条信息的ID吧! 既然是获取同类产品和相同价格 
    就说明有产品类型的字段和价格的字段 在鼠标经过产品类型的时候可以把它的类型作为where后面的条件去查询相同产品的名称,至于价格也用同样的办法。为了体现良好的界面效果,读数据的时候可以用AJAX,在显示的时候可以用DIV 这样就可以达到你所说的网上的效果了。
      

  9.   

    数据库的方面,要完成上述功能通常是给同类型的产品放在同一个分类中。显示同分类的产品。价格方面,通常是在同样分类的情况下以一个Price Range来搜索这个分类中的产品。因为你想用100万买房子,出现110万的飞机是没有意义的。
      

  10.   

    4楼的没错,每个产品都设置一个关键字,like一下就出来了。接分~~~~
      

  11.   

    根据关键字去查询就行了知道当前产品的信息,根据你浏览的产品主键去查询数据库像这样的关联性东西,可以用Ajax来做,做法都差不多,但是效果要比数据绑定好
      

  12.   

    1.不建表,就直接用sql.相似的产品就是根据产品的关键字去检索.产品表多加字段关键字;价格相似就是根据目前的价格去检索价格范围内的产品.选出来后根据需要显示前几个2.建表的话.可以建一个表,产品1id,产品2id,关系(类型或者价格).这个可以人为控制记录.
      

  13.   

    1.我建议你用一下,SQL中模糊查询可以满足你一个需求
    2.价格比较的在SQL中用BETWEEN查询价格也能满足你的要求
      

  14.   

    用ajax。当鼠标在商品上时,取得商品的相关信息,运行后台模糊查询,然后把相关结果浮动显示出来。
      

  15.   

    我看关键是你的数据如何分类,如何去实现这个“相近”,单纯的like在系统中实现效率肯定不可取。
    假如我有两个产品a和b,价格都是3000块,我十分要查我的数据表like两次?数据表有多少记录?太多了
    2999块的也要like下,那得了。
    可以自己分表存储数据,比如100价为的存table_100中,1000的存table_1000中,还有很多可以自己设定的规则,分类存。可以适当考虑数据冗余,为了性能!,