2010-01-05 4 views
1

У меня есть база данных MySQL с различными таблицами, записи которых могут быть помечены, поэтому у меня есть таблица tags и таблица tag_associations, которая связывает теги с другими таблицами «taggable» через несколько внешних ключей, а также к "владеющим" пользователь - мои полей что-то вроде следующего:Подсчет записей таблицы с несколькими внешними ключами (MySQL)

  • tag_association_id (первичный ключ)
  • user_id (тег ассоциации создателя)
  • tag_id (связанный тег)
  • artist_id (с тегом a rtist может быть пустым)
  • album_id (помечено альбом может быть пустым)
  • track_id (помеченный трек может быть пустым)

Я в принципе хочу, чтобы сосчитать все элементы, которые были помечены определенный тег - так что-то по результатам этого запроса:

SELECT 
    COUNT(ta.tag_association_id) AS how_many 
FROM 
    tag_associations AS ta 
    LEFT JOIN users AS u ON ta.user_id = u.user_id 
WHERE 
    ta.tag_id = '480' 
    AND u.user_status = 'active' 

Но проблема с этим запросом заключается в тех случаях, когда тот же тег был применен к тому же пункту несколько пользователей, поэтому если 2 разных пользователям помечать художник «Bobby Jones Band» как «рад», он учитывает обе ассоциации тегов где я просто хочу пересчитать его один раз. Я попробовал, добавив это к вышесказанному:

GROUP BY ta.artist_id, ta.album_id, ta.track_id 

... который получил меня близко, но не дали точных результатов мне нужно - он дал мне несколько результатов строк различных подсчетов. Есть ли какая-нибудь магия, которую я могу использовать в таком случае, и сохранить ее в одном запросе? Оставаясь как можно эффективнее, конечно :) Спасибо!

ответ

1

Если у меня есть вопрос правильно, то ваш GROUP BY должен почти выполнить эту работу.

Это решение должно получить уникальные строки от tag_associations и считать их.

SELECT COUNT(*) 
FROM 
(
    SELECT 1 
    FROM tag_associations AS ta 
    LEFT JOIN users AS u ON ta.user_id = u.user_id 
    WHERE ta.tag_id = '480' 
    AND u.user_status = 'active' 
    GROUP BY ta.artist_id, ta.album_id, ta.track_id 
) x 
+0

Благодарим за отзыв Peter! Когда я запускаю это, я получаю сообщение об ошибке: «Каждая производная таблица должна иметь свой собственный псевдоним». Мне кажется, что результаты подзапроса используются в FROM, и поэтому, поскольку запрашиваемая таблица во внешнем запросе - это правильно? В этом случае имеет смысл, что результаты не появятся, хотя ... –

+0

Извините. Я добавил псевдоним ('x'), повторите попытку. –

+0

Ах, вот так, спасибо! –

Смежные вопросы