【问题标题】:SQL Sum sub-query with joined tables?带有连接表的 SQL Sum 子查询?
【发布时间】:2013-09-18 12:43:53
【问题描述】:

我有一个论坛站点,其中包含帖子 (gem) 和文件附件 (gemdetail) 以及对帖子的回复 (gem),回复也可以包含文件附件 (gemdetail)。由于帖子和回复都存储在同一个表中,因此它产生了一个有趣的左连接,可以选择具有相关回复和详细信息的所有帖子。

我想在组合(评分)中添加另一个表,以允许用户对每个帖子进行评分。然后,我希望能够在同一个查询中获得每个帖子的总评分。如何添加 sum(rating),以便输出的每一行都有 gemid 的总和。我知道我需要一个类似于 here 的总和子查询(带有临时结果集的派生表),但它超出了我的技能范围。提前致谢。

表结构如下

table: gems
gemid    title        replygemid
-----    -----        ----------
220      map              NULL
223      inhabitants      NULL
403      reply to map     220

table: gemdetail
gemid    filename
------   --------
220      uganda-map.jpg
220      mozambique-map.jpg
223      uganda-inhabitants.jpg
223      kenya-inhabitants.jpg
403      mona-lisa-x8.jpg 

table: rating (to be added)
gemid    rating
-----    -------
220       1
220       5
223       3
403      -1

我当前的(简化的)查询

SELECT g.gemid as ggemid, g.title as gtitle, gemdetail.filename as gfilename, r.filename as rfilename
FROM (SELECT gems.* FROM gems ) g 
LEFT JOIN 
(SELECT title, x.gemid, x.replygemid, x.userid, y.filename  from gems x 
LEFT JOIN gemdetail y ON x.gemid = y.gemid ) r ON g.gemid = r.replygemid 
LEFT JOIN gemdetail ON g.gemid = gemdetail.gemid 

结果可能如下所示

ggemid   replygemid gtitle          gfilename                   rfilename
------   ---------- ------          ---------------------       ----------------
220      403        Map             uganda-map.jpg              mona-lisa-x8.jpg
220      403        Map             mozambique-map.jpg          mona-lisa-x8.jpg
223      NULL       Inhabitants     uganda-inhabitants.jpg      NULL
223      NULL       Inhabitants     kenya-inhabitants.jpg       NULL
223      NULL       Inhabitants     kenya-inhabitants.jpg       NULL

【问题讨论】:

  • 您希望添加评分总和后的结果如何?

标签: mysql sql subquery


【解决方案1】:

我想这就是你想要的:

SELECT g.gemid as ggemid, g.title as gtitle, gemdetail.filename as gfilename, r.filename as rfilename, rt.sum_rating
FROM (SELECT gems.* FROM gems ) g 
LEFT JOIN 
(SELECT title, x.gemid, x.replygemid, x.userid, y.filename  from gems x 
LEFT JOIN gemdetail y ON x.gemid = y.gemid ) r ON g.gemid = r.replygemid 
LEFT JOIN gemdetail ON g.gemid = gemdetail.gemid 
LEFT JOIN (SELECT gemid, SUM(rating) as sum_rating from rating GROUP BY gemid) rt ON g.gemid = rt.gemid

【讨论】:

  • 感谢您提供有效的答案。使用我所拥有的东西是最简单和最直接的。由于我的查询涉及更多表,因此它是一个简单的即插即用。比我想象的要简单。谢谢!
【解决方案2】:

SQL Fiddle

查询

SELECT g.gemid as ggemid, g2.gemid as replygemid, 
       g.title as gtitle, gd.filename as gfilename, 
       gd2.filename as rfilename, SUM(rating) as rating
FROM gems g
INNER JOIN gemdetail gd ON g.gemid = gd.gemid
INNER JOIN rating r ON g.gemid = r.gemid
LEFT OUTER JOIN gems g2 ON g.gemid = g2.replygemid
LEFT OUTER JOIN gemdetail gd2 ON g2.gemid = gd2.gemid
GROUP BY g.gemid, g2.gemid, g.title, 
         gd.filename, gd2.filename

Results

| GGEMID | REPLYGEMID |       GTITLE |              GFILENAME |        RFILENAME | RATING |
|--------|------------|--------------|------------------------|------------------|--------|
|    220 |        403 |          map |     mozambique-map.jpg | mona-lisa-x8.jpg |      6 |
|    220 |        403 |          map |         uganda-map.jpg | mona-lisa-x8.jpg |      6 |
|    223 |     (null) |  inhabitants |  kenya-inhabitants.jpg |           (null) |      3 |
|    223 |     (null) |  inhabitants | uganda-inhabitants.jpg |           (null) |      3 |
|    403 |     (null) | reply to map |       mona-lisa-x8.jpg |           (null) |     -1 |

【讨论】:

  • 我从您的回答中学到了很多东西(当然有效)。我不知道 sql Fiddle 存在。我学到了更多关于分组的知识。你在清理我的命名法方面做得非常出色。为了让它工作,我不得不恢复到左连接,因为所有链接都不存在。我非常感谢您花时间制作 Fiddle 并让它发挥作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
  • 2017-08-06
相关资源
最近更新 更多