调用目的:首页调用推荐商铺 
表结构:商铺一个表(shops)、商铺图片一个表(pictures)、打折卡一个表(carddiscounts) 
表间关系:商铺表字段:sid = 图片表字段:shopid = 打折卡字段:shopid
这三个表就是靠这个商铺ID号联系起来的。一开始不调用打折卡的时候,只调用两个表,这个没有错误: Select s.sid,s.shopname,p.folder,p.filename From shops s,pictures p Where s.finer=1 and (s.classcode BETWEEN '1100' AND '1199') and s.sid=p.shopid and Order by s.sid DESC limit 0,8然后加上了第3个表:Select s.sid,s.shopname,p.folder,p.filename,c.discount,c.exception From shops s,pictures p,carddiscounts c where s.finer=1 and (s.classcode BETWEEN '1100' AND '1199') and s.sid=p.shopid and c.shopid=p.shopid Order by s.sid DESC Limit 0,8以目前的数据,正常的话满足条件的应该只有一个商铺,而这个商铺有3张图片(图片表里),正常的话应该只显示其中一张图片吧~~~但是却出来三条结果,都是这同一个商铺,把3张图都调出来了 SQL不到家~~~望大家指正一下 调用结果页面演示: http://vip.0534.com/ 下半部分的 商家推荐 之 购物 那里...

解决方案 »

  1.   

    你的第一个SQL语句存在语法错误啊! 建议你直接贴你实际中有语句。否则别人很难断定问题所在。Select s.sid,s.shopname,p.folder,p.filename 
    From shops s,pictures p 
    Where s.finer=1 
    and (s.classcode BETWEEN '1100' AND '1199') 
    and s.sid=p.shopid and Order by s.sid DESC limit 0,8
      

  2.   

    噢噢确实多写了一个and,程序里是没写错的~~~程序里就是这样调用的。
    Select s.sid,s.shopname,p.folder,p.filename,c.discount,c.exception From shops s,pictures p,carddiscounts c where s.finer=1 and (s.classcode BETWEEN '1100' AND '1199') and s.sid=p.shopid and c.shopid=p.shopid Order by s.sid DESC Limit 0,8补充几个字段说明:
    s.sid - shops 表 商铺ID
    s.shopname - shops 表 商铺名称p.shopid - pictures 表 所属商铺ID
    p.folder - pictures 表 图片存放目录
    p.filename - pictures 表 图片文件名c.shopid - carddiscounts 表 所属商铺ID
    c.discount - carddiscounts 表 折扣率(如 9.5)
    c.exception - carddiscounts 表 折扣说明
      

  3.   

    carddiscounts 表,只有一条记录与 shops 表匹配
    但是pictures 表,则有可能会有多条记录与 shops 表的记录匹配
      

  4.   

    shops 表:(第一行为字段名,classcode为类别ID;finer为是否推荐)
    sid   shopname       classcode    finer
    1     德州大酒店       1001    1
    2     德州市百货大楼   1114    1
    3     金盾法律事务所   1401    0
    4     相记大盘鸡       1010    1pictures 表:(第一行为字段名,pid为标识)
    pid   shopid    folder     filename
    1     1         2009-06    15_1244706626.jpg
    2     2         2009-06    81_1244799824.gif
    3     2         2009-06    96_1244799892.gif
    4     2         2009-06    25_1244800264.jpgcarddiscounts 表:(第一行为字段名)
    shopid    discount    exception
    1         9.5         烟酒、特价菜除外
    2         9.0         特价商品除外
    4         8.5         优惠时间至2009-08月,另外扎啤免费基本用到的就是这些字段,pictures表里的4条记录,其中有3条都是shopid=2的,即有3张图片是“德州市百货大楼”的,但是调用时,只需要显示出“德州市百货大楼”即可,不用显示3个“德州市百货大楼”。。调用页面:http://vip.0534.com 下半部分,推荐商铺 - 购物 那里
      

  5.   

    Select s.sid,s.shopname,p.folder,p.filename,c.discount,c.exception 
    From shops s,
    (select * from pictures p1 
    where not exists (select 1 rom pictures where shopid=p1.shopid and pid>p1.pid)
    ) p,
    carddiscounts c 
    where s.finer=1 
    and (s.classcode BETWEEN '1100' AND '1199') 
    and s.sid=p.shopid 
    and c.shopid=p.shopid 
    Order by s.sid DESC Limit 0,8
      

  6.   

    那么你要取pictures 表中SHOPID=2的哪条记录?最大PID OR最小?
      

  7.   


    倒是哪张都可以~~~最新的吧,pid最大的。
      

  8.   

    最大:
    select a.* from pictures a inner join
    (select shopid,max(pid) as ma frm pictures group by shopid) b on a.shopid=b.shopid and a.pid=b.ma
    将上述结果再与其它两表连接
      

  9.   


    哎呀感谢你的思路——~我怎么就忘了Group by了我那语句加上group by 就好啦
    Select s.sid,s.shopname,p.folder,p.filename,c.discount,c.exception From shops s,pictures p,carddiscounts c where s.finer=1 and (s.classcode BETWEEN '1100' AND '1199') and s.sid=p.shopid and c.shopid=p.shopid Group by p.shopid Order by s.sid DESC Limit 0,8但是这样Group by的时候,图片是调用pid最小的了,也就是最老的图片了。然后又改了一下:Select s.sid,s.shopname,p.folder,p.filename,c.discount,c.exception From modoer_shops s,(select * from modoer_pictures order by pid desc) p,modoer_carddiscounts c Where s.finer=1 and (s.classcode BETWEEN '1100' AND '1199') and s.sid=p.shopid and c.shopid=p.shopid Group by p.shopid Order by s.sid DESC Limit 0,8在此感谢两位大哥~~~