我正在尝试显示已使用特定标签标记的烹饪书列表。这是有效的,但我不能显示不同用户将标签应用于每本书的次数。我希望按这个数字排序,以便多个用户标记为“烘焙”的书的排名高于仅由一个用户标记为“烘焙”的书。
以下是一个略微简化的表格列表:
表1:烹饪书
ID, Title, Author, etc.
表2:食谱
ID, recipe_title, recipe, cookbook_id
表3:recipe_reviews
ID, recipe_id, star_rating, comments
表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
更新:当我调试它并且意识到第二次计数需要DISTINCT并且它试图计算错误的变量时,此查询最终正常工作;应该是user_id。
答案 0 :(得分:1)
要调试它,请尝试一个简单的SELECT *并删除GROUP BY子句和COUNT个字段,这样您就可以看到在分组之前生成的原始数据,您可能会发现您的连接不能按预期工作