2010-11-04 84 views
0

我正在尝试显示已用特定标记标记的食谱列表。这是行得通的,除了我不能显示标签已被不同用户应用于每本书的次数。我想按这个数字排序,例如,多个用户标记为“烘焙”的书会比只有一个用户标记为“烘焙”的书高。MySQL JOIN查询问题/ COUNTs

下面是表的略微简化的列表:

表1:食谱

ID, Title, Author, etc. 

表2:配方

ID, recipe_title, recipe, cookbook_id 

表3:recipe_reviews

ID, recipe_id, star_rating, comments 

TABL E 4:book_tags

tag_id, tag_text 

表5:book_user_tag

user_id, book_id, tag_id 

这是目前编写的测试查询:

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:该查询结束了工作,当我调试它,意识到在第二次计数中需要DISTINCT,并且它试图计算错误的变量;应该是user_id。

回答

1

要调试此操作,请尝试一个简单的SELECT *并删除您的GROUP BY子句和COUNT字段,这样您可以看到在分组之前生成的原始数据,您可能会发现您的连接并不像您一样工作预期。

+0

很好的建议!我把它分解成基本知识,并意识到我在对错误变量进行COUNT处理。 – mandel 2010-11-04 21:01:55

+0

非常好,我很乐意帮忙! – Infotekka 2010-11-04 21:11:49