2013-04-26 49 views
0

我试图通过子查询来计算与每个书签相关的标签和评论的数量。但是,它只是计算所有标签和评论。COUNT(*)在子查询中返回每一行,而不仅仅是那些特定的ID

SELECT 
    bookmarks.bookmark_id, 
    bookmarks.user_id, 
    DATE_FORMAT(bookmarks.creation, '%W %D of %M %Y, %H:%i') AS creation, 
    DATE_FORMAT(bookmarks.modification, '%W %D of %M %Y, %H:%i') AS modification, 
    bookmarks.url, 
    bookmarks.title, 
    bookmarks.snippet, 
    bookmarks.status, 
    (
     SELECT 
      COUNT(tags.tag) AS tags 
     FROM 
      tags 
     INNER JOIN 
      bookmarks 
     ON 
      (tags.bookmark_id = bookmarks.bookmark_id) 
     WHERE 
      (tags.user_id = '1') 
    ) AS tags, 
    (
     SELECT 
      COUNT(bookmarks_comments.comment) AS comments 
     FROM 
      bookmarks_comments 
     INNER JOIN 
      bookmarks 
     ON 
      (bookmarks_comments.bookmark_id = bookmarks.bookmark_id) 
     WHERE 
      (bookmarks_comments.user_id = '1') 
    ) AS comments 
FROM 
    bookmarks 
WHERE 
    (bookmarks.user_id = '1') 
GROUP BY bookmarks.bookmark_id 

也许是时间的晚了。我不知道。但我无法弄清楚。有任何想法吗?

+1

请停止使用'GROUP BY'这种方式。这不是标准的,从长远来看会伤害你。 – Kermit 2013-04-26 21:53:04

+0

请看这里:http://rpbouman.blogspot.de/2007/05/debunking-group-by-myths.html – 2013-04-27 15:17:47

回答

2

您的子查询正在进行连接,因此它与外部查询不相关。这里是你想要的第一个:

(
    SELECT 
     COUNT(tags.tag) AS tags 
    FROM 
     tags 
    where 
     (tags.bookmark_id = bookmarks.bookmark_id) 
    and 
     (tags.user_id = '1') 
) AS tags, 

通知我删除了join。现在,当SQL看到bookmarks.bookmarks_id时,它将转到外部查询中的bookmarks表。

而你也有与comments相同的问题。

+0

只是让你知道,该查询片断在语法上不正确,但它 - 总体上 - 正确的想法。它应该在那里,而不是在那里然后在哪里。 – 2013-04-27 08:16:41

+0

@WayneSmallman。 。 。我修好了它。另外,假设'user_id'是一个整数,你不需要把'1'放在引号中。 – 2013-04-27 15:16:09

相关问题