Проблема с запросом MySQL JOIN / COUNTs - PullRequest
0 голосов
/ 04 ноября 2010

Я пытаюсь отобразить список поваренных книг, которые были помечены определенным тегом. Это работает, за исключением того, что я не могу также показать, сколько раз тег был применен к каждой книге разными пользователями. Я бы хотел отсортировать по этому номеру, чтобы книга с тегом «выпечка», например, несколькими пользователями, имела более высокий рейтинг, чем книга с тегом «выпечка» только одним пользователем.

Вот несколько упрощенный список таблиц:

Таблица 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.

1 Ответ

1 голос
/ 04 ноября 2010

Чтобы отладить это, попробуйте простой SELECT * и удалите предложение GROUP BY и поля COUNT. Таким образом, вы можете увидеть необработанные данные, полученные до их группировки, вы можете обнаружить, что ваши объединения работают не так, как вы ожидали .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...