2011-03-31 2 views
1

Я не могу заставить этот запрос работать. Я пробовал это, но не работает:Самые используемые теги автора - mysql normalized database

SELECT tags.* 
FROM blog_tags AS tags 
LEFT JOIN blog_items AS items ON (items.authorid = 4) 
LEFT OUTER JOIN blog_items_tags AS itemstags ON (itemstags.itemid = items.id) 
GROUP BY tags.id 

Что я хочу, так это получить все теги, которые автор использовал в статьях.

За идею: Базы данных являются:

  • blog_tags (идентификатор, название)
  • blog_items (только изделия с поля ид, AuthorID и т.д ...)
  • blog_items_tags (Itemid, TagID).

Какое правильное заявление? (Я не очень хорошо разбираюсь в mysql)

+0

У вас есть сообщение об ошибке? – Stony

+0

нет, mysql просто продолжает обработку на этом. Другие выдают такие ошибки, как: # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии сервера MySQL, для правильного синтаксиса для использования рядом с «INNER JOIN blog_items_tags AS itemstags ON (itemstags.itemid = items.id)» в строке 4 – Bert

+0

Опишите, как вы выполняете запрос - PHP страница? программа администрирования запросов? PhpMyAdmin? – Smandoli

ответ

1

Вы отсутствующее условию соединения (ваша таблица blog_tags является нигде не используется). Кроме того, вам нужен INNER JOIN, так как вам нужны только те теги, которые были использованы, а не все теги и соответствующая информация.

Здесь исправляется запрос:

SELECT tags.* 
FROM blog_tags AS tags 
INNER JOIN blog_items_tags AS itemstags ON (itemstags.tagid = tags.id) 
INNER JOIN blog_items AS items ON items.authorid = 4 AND items.id = itemtags.itemid 
GROUP BY tags.id 
+0

ДА! Это оно! Окончательный запрос выглядит так: для тех, кто заинтересован: «SELECT tags. *, COUNT (*) AS tagcount FROM blog_tags AS теги INNER JOIN blog_items_tags AS itemstags ON (itemstags.tagid = tags.id) INNER JOIN blog_items AS items ON (элементы .authorid = 4 AND items.id = itemstags.itemid) GROUP BY tags.id ORDER BY tagcount DESC, RAND() LIMIT 10 "Спасибо! – Bert

1

Устранение неполадок при запуске более простых версий этого запроса, а затем наращивании. Начать с

SELECT tagid FROM blog_tags 

Затем обработать.

В частности, попробуйте удалить AS. Этот аромат SQL может потребовать его отсутствия:

SELECT tagid FROM blog_tags tags 
+0

Да, но большую часть времени у меня нет ошибки, я просто возвращаю все теги, а не только теги автора. Запрос не выполняет свою работу. Пока не могу понять. – Bert

+0

Ах. Это необходимая информация для вашего сообщения. – Smandoli

+0

Предложите, чтобы вы отображали поля запроса из других таблиц помимо тегов, чтобы вы могли видеть, что происходит. Я ожидаю, что вы справитесь с этим, попробовав варианты. – Smandoli

2

Я всегда использую подзапросы в таких случаях. Вы также можете использовать соединения, но я никогда не был так комфортен писать их (и я думаю, что они все равно оценивают один и тот же поиск БД), но поправьте меня, если я ошибаюсь!), Поэтому я бы написал что-то вроде этого:

SELECT tags.* FROM tags WHERE id IN (
    SELECT tagid FROM blog_items_tags WHERE itemid IN (
     SELECT id FROM blog_items WHERE authorid = 4 
    ) 
); 

это немного грязнее, чем присоединиться, но это имеет смысл для меня, когда я вернусь и читать его - надеюсь, что это помогает!

Edit: Если вы хотите, сколько раз был использован каждый тег, вы можете добавить COUNT и GROUP BY к запросу:

SELECT tags.*, COUNT(*) FROM tags WHERE id IN (
    SELECT tagid FROM blog_items_tags WHERE itemid IN (
     SELECT id FROM blog_items WHERE authorid = 4 
    ) 
) GROUP BY tags.title; 
+0

Он, спасибо. Пробовал и работал.Но хотя я не знаком с этими обозначениями; Каков правильный способ использования объединений? (Я хочу подсчитать время, когда тег также используется автором и добавляет его в запрос, не может видеть, как это делается здесь) – Bert

+0

При использовании подзапросов для большой базы данных - убедитесь, что ваш сервер mysql правильно использует индексы (запустите запрос с помощью EXPLAIN). Есть сообщения об ошибках, что этот подход медленный, поскольку индексы не используются, и рекомендуется использовать JOIN для этих типов приложений. – Sergey

+0

@Serge - Cool - спасибо за информацию. Я буду следить за этим в будущем. Ура! –

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