加入;只有一个记录请!

时间:2010-02-16 10:23:49

标签: sql mysql join

好吧,我从一个设计糟糕的数据库中得到了一个复杂的查询......在一个查询中,我需要从一个数据库获取一个计数,另一个数据库中的信息来自另一个数据库,这里有:

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

类型(blog_id,标题,正文......等等)//是的我知道类型是博客的名称而不只是表格中的ID号而不是我的设计

blog_link(blog_id,blog_type,section_id,game_id)

blog_comments(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以某种方式进行分组,那将是金牌......任何人都有想法?

非常感谢提前

  • Dorjan

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

3 个答案:

答案 0 :(得分: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',...

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

答案 1 :(得分:0)

未经测试:

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

答案 2 :(得分:0)

我认为您需要首先获取“X”类型的博客,然后对这些博客进行评论。

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

)AS EXPR1 加入     blog_comments bc ON     (         bc。item_id = EXPR1。blog_id     )