【问题标题】:JOIN; only one record please!加入;请只记录一张!
【发布时间】:2010-02-16 10:23:49
【问题描述】:

好的,我有一个来自设计不佳的数据库的复杂查询...在一个查询中,我需要从一个数据库中获取计数,从另一个数据库获取信息以及来自另一个数据库的链接,这里是:

每个博客都有一个类型(新闻、报告等)和网站特定部分的版块 ID,但它也可以链接到多个电脑游戏和版块)

type (blog_id, title, body, etc...) // 是的,我知道类型是博客的名称,而不仅仅是表中的 id 号,不是我的设计

blog_link (blog_id, blog_type, section_id, game_id)

blog_cmets(blog_id、blog_type、comment 等)

所以查询有点像这样:

SELECT bl.`blog_id`, count(bc.`blog_id`) AS 'comment_count', t.`added`
FROM blog_link bl
JOIN type t ON t.`id` = bl.`blog_id`
JOIN blog_comments bc ON (`item_id` = bl.`blog_id` AND `blog_type` = '[$type]')
WHERE bl.`section_id` = [$section_id] AND bl.`blog_type` = '[$type]'
GROUP BY bl.`blog_id`
ORDER BY `added` DESC
LIMIT 0,20

现在这很好,只要我没有多个游戏与一个博客相关联。

编辑:所以目前如果关联了多个游戏,comment_count 会乘以关联的游戏数量...不好。

我不知道我怎么能做到这一点......它只是不工作!如果我能在加入之前以某种方式按 blog_id 分组,那就太好了……有人有想法吗?

在此先感谢

  • 多尔扬

edit2:我提供了赏金,因为这个问题肯定可以解决!!来吧,伙计们!

【问题讨论】:

  • 您使用的是什么数据库?是否支持子查询?
  • @extraneon:标题写着“MySQL”(我添加的标签)
  • 您的查询现在返回什么,您希望它返回什么?
  • "现在这很好,只要我没有多个游戏与一个博客相关联。"我已经编辑了主要文章。
  • 我认为您的示例不完整。你写了WHERE ia.section_id,但是ia没有定义...

标签: sql mysql join


【解决方案1】:

您似乎只想获得一个 DISTINCT 计数,因此只需在计数中添加 DISTINCT。尽管您需要为每条评论添加某种唯一标识符。理想情况下,每条评论都有一个唯一的 id(即自动递增),但如果没有,您可能会使用 blog_id+author+timestamp。

SELECT bl.`blog_id`, count(DISTINCT CONCANT(bc.`blog_id`,bc.`author`,bc.`timestamp`) AS 'comment_count',...

这应该会给你一个独特的评论计数。

【讨论】:

    【解决方案2】:

    我认为您需要先获取“X”类型的博客,然后为这些博客计算 cmets。

    SELECT 
    EXPR1.blog_id, 
    count(bc.`blog_id`) AS 'comment_count'
    

    来自 ( 选择 bl.blog_id, t.added 从 blog_link bl 加入 键入 t ON t.id = bl.blog_id

    WHERE 
        bl.`section_id` = [$section_id] 
        AND 
        bl.`blog_type` = '[$type]'
    GROUP BY 
        bl.`blog_id`
    ORDER BY 
        `added` DESC
    LIMIT 0,20
    

    ) 作为 EXPR1 加入 blog_cmets bc ON ( bc.item_id = EXPR1.blog_id )

    【讨论】:

      【解决方案3】:

      未测试:

      SELECT bl.`blog_id`, count(bc.`blog_id`) AS 'comment_count', t.`added`
      FROM
      (
        SELECT DISTINCT blog_id, blog_type 
        FROM blog_link
        WHERE
         `section_id` = [$section_id] 
         AND `blog_type` = '[$type]'
      ) bl
      INNER JOIN blog_comments bc ON (
          bc.`item_id` = bl.`blog_id` AND bc.`blog_type` = bl.`blog_type`
      )
      INNER JOIN type t ON t.`id` = bl.`blog_id`
      GROUP BY bl.`blog_id`
      ORDER BY t.`added` DESC
      LIMIT 0,20
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多