开发者

Problem with MySQL JOIN query / COUNTs

I am trying to display a list of cookbooks which have been tagged with a specific tag. This is working, except I cannot also display the number of times the tag has been applied to each book by different users. I would like to sort by this number so a book tagged 'baking' for example, by multiple users, would rank higher than a book tagged 'baking' by only one user.

Here is a sligh开发者_Go百科tly simplified list of tables:

Table 1: cookbooks

ID, Title, Author, etc.

Table 2: recipes

ID, recipe_title, recipe, cookbook_id

Table 3: recipe_reviews

ID, recipe_id, star_rating, comments

Table 4: book_tags

tag_id, tag_text

Table 5: book_user_tag

user_id, book_id, tag_id

This is the test query as currently written:

SELECT cookbooks.*, COUNT(DISTINCT recipe_reviews.ID) as numreviews, COUNT( book_user_tag.tag_id) as numtags, AVG(recipe_reviews.star_rating) as average, book_tags.tag_text 
          FROM cookbooks 
          LEFT OUTER JOIN recipes ON cookbooks.ID = recipes.cookbook_id 
          LEFT OUTER JOIN recipe_reviews ON recipes.ID = recipe_reviews.recipe_id 
          LEFT OUTER JOIN book_user_tag ON cookbooks.ID = book_user_tag.book_id
          INNER JOIN book_tags ON book_user_tag.tag_id = book_tags.tag_id
          WHERE book_user_tag.tag_id = 69
          GROUP BY cookbooks.ID
          ORDER BY numtags DESC

UPDATE: This query ended up working when I debugged it and realized that a DISTINCT was required on the second count, and that it was trying to count the wrong variable; should have been user_id.


To debug this, try a simple SELECT * and remove your GROUP BY clause and COUNT fields, this way you can see the raw data that is produced before it is grouped, you may find that your joins are not working as you expected.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜