有点晕,SQL语法高人请进

字体: | 打印

真是学艺不精,这个语句不知道如何构造

有5个表(这些表格设计的可能不合理,此贴不予讨论,只看如何构造正确的SQL返回记录

a表video(主表)----包含主要的记录,field有id,name,URL等
b表category-----------分类名称,field有 id,name等
c表video_category--记录video的分类信息,field是videoID和categoryID
d表site-----------------site的名字,field有id和name
e表video_site---------记录来自哪个site,field有videoID和siteID

可见,记录的video_category对应video记录的categoryID,但categoryName需要在b表中获得
video的site信息也是如此,video_site记录了video的siteID,但是siteName需要在d表中获得



问题:
如果构造一个正确的SQL语句,以便返回完整记录,并便于使用

下面这个应该是错误的

QUOTE:

SELECT a.*, b.*, c.*, d.*, e.*
FROM video AS a
LEFT JOIN category AS b ON b.id = c.categoryID
LEFT JOIN video_category AS c ON c.videoID = a.id
LEFT JOIN site AS d ON d.id = c.siteID
LEFT JOIN video_site AS e ON a.id = e.videoID



我也来说两句 查看全部评论 相关评论

  • 一片空白 (2008-10-13 08:57:24)



    你是来考试的吗?
  • 老虎 (2008-10-13 09:07:54)

    被考倒了

    上学的时候不用心,现在才发现水平是如此之有限

  • 精灵鼠 (2008-10-13 09:13:00)

    其实表建的本来就有问题

    video 与 category  的关系是多对一的, 不是多对多的, 根本就不需要video_category , 如果是多对多的关系才建video_category 表
    同样,video与site 的关系同样也是多对一的.
    其实在video表中多两个字段, 再有category  ,与site 两个表就可以了. 而且关系也简单的多.

    当然, 你将表模型建成上面所说的也可以. SQL也非常简单, 要看一下你的表之前是用否可以用内联,如果用内联就更简单了. 直接join就完了,如果你说可以为空,那行就不能用内联了, 可以用子查询.反正有根据你的实际情况,有若干解决办法了

    要是还不明白,我在MSN上告诉你吧
  • 老虎 (2008-10-13 09:19:32)

    哈哈,大老鼠你终于出现了

    你说的对,所以我就不讨论表结构是否合理

    告诉俺那些若干解决方法,越全越好,正好补习一下



    我这里暂时上不了MSN

    回贴或者给我小窗口吧
  • 精灵鼠 (2008-10-13 09:32:43)

    这样就可以呀
    SELECT a.*, b.*, d.*
    FROM video AS a
    LEFT JOIN video_category AS c ON c.videoID = a.id
    LEFT JOIN category AS b ON b.id = c.categoryID
    LEFT JOIN video_site AS e ON a.id = e.videoID
    LEFT JOIN site AS d ON d.id = e.siteID

    注意:换了顺序,还有EFT JOIN site AS d ON d.id = e.siteID 你写错了

    [ 本帖最后由 精灵鼠 于 2008-10-13 09:34 编辑 ]
  • 逸云AA (2008-10-13 14:02:44)

    QUOTE:

    原帖由 精灵鼠 于 2008-10-13 09:32 发表
    这样就可以呀
    SELECT a.*, b.*, d.*
    FROM video AS a
    LEFT JOIN video_category AS c ON c.videoID = a.id
    LEFT JOIN category AS b ON b.id = c.categoryID
    LEFT JOIN video_site AS e ON a.id = e.videoID
    L ...
    父表left join子表?

    表关系是不是这样:


    hu.JPG




    可以用最土的办法:
    SELECT a.id as vidioId, a.name as vidioName,
           b.id as categoryID, b.name as categoryName,
           d.id as siteID, d.name as siteName
    FROM video a , category b, video_category c, site d, video_site e
    where a.id = c.vidioId and b.id = c.c.categoryID
      and a.id = e.videoID and d.id = e.siteID

    最好再group by 一下,免得出现重复项
  • luckys (2008-10-13 14:41:11)

    回答的有 oracle  的写法,有sqlserver的,看你的数据库再用
  • 老虎 (2008-10-14 06:18:30)

    QUOTE:

    原帖由 逸云AA 于 2008-10-13 14:02 发表


    父表left join子表?

    表关系是不是这样:
    114203


    可以用最土的办法:
    SELECT a.id as vidioId, a.name as vidioName,
           b.id as categoryID, b.name as categoryName,
           d.id as siteID, ...
    理解正确,表达清楚  

    不过我这样尝试出来的结果,好像有很多臃余
  • 老虎 (2008-10-14 06:40:01)

    QUOTE:

    原帖由 luckys 于 2008-10-13 14:41 发表
    回答的有 oracle  的写法,有sqlserver的,看你的数据库再用
    是MYSQL的,和上述两种有点区别,不过不太大

    我主要是想补习一下JOIN,以前基本没有完整理解过

    可以按照SQL Server的写法指点下
  • 逸云AA (2008-10-14 10:13:30)

    QUOTE:

    原帖由 老虎 于 2008-10-14 06:18 发表



    理解正确,表达清楚  

    不过我这样尝试出来的结果,好像有很多臃余
    要group BY 一下。
  • tydy (2008-10-14 11:35:08)

    高人一大串,佩服佩服!
  • 老虎 (2008-10-14 11:41:49)

    已经使用,MYSQL里面的对应语法是ORDER BY

    返回有臃余显示


    检查了数据库

    主表video没问题,142个记录

    但是video_category (488条记录)和video_site(391条记录)有臃余
    (真不知道当时怎么生成的,也许是计算机的基础和功底不灵)

    如果不考虑数据库是否合理,仅使用SQL的办法,该如何写?
  • jinhailong (2008-10-14 11:50:04)

    老虎,建议你写个存储过程慢慢搞,实在不行再造个临时表啥的

    没有搞不定的。
  • 逸云AA (2008-10-14 11:50:37)

    Order By 是排序用的,group By是排除冗余记录的。

    试一下这个:
    SELECT a.id as vidioId, a.name as vidioName, a.url as VidioUrl
           b.id as categoryID, b.name as categoryName,
           d.id as siteID, d.name as siteName
    FROM video a , category b, video_category c, site d, video_site e
    where a.id = c.vidioId and b.id = c.categoryID
      and a.id = e.videoID and d.id = e.siteID
    group by a.id , a.name , a.url ,
           b.id , b.name,
           d.id, d.name

    关键看你要查什么了,原来的意思似乎是要查vidio、分类信息和所来源站点的信息,
    当然会出现一个Vidio多条查询结果(分类和站点不同)。
  • 老虎 (2008-10-14 13:04:01)

    原来如此

    太丢人了

    不许宣扬哈!!!!