2011-04-03 1 views
1

Comment pouvez-vous joindre à ces 5 tables ensemble:Sélection de certains messages marqués et leurs auteurs

tag: id, name 
author: username, id 
thread_tags: thread_id, tag_id 
thread: id, content 
author_threads: author_id, thread_id 

(J'ai aussi une table appelée author_tags (tag_id, AUTHOR_ID), mais je ne pense que c'est nécessaire ici).

Je veux sélectionner tous les sujets qui sont marqués d'une certaine étiquette et leurs auteurs.

Le code suivant retourne #1066 - Not unique table/alias: 'tag'

SELECT thread.content, author.username 
FROM tag 
JOIN thread_tags ON thread.id = thread_tags.thread_id 
JOIN tag ON thread_tags.tag_id = tag.id 
JOIN author_threads ON author.id = author_threads.author_id 
JOIN author ON author_threads.thread_id = thread.id 
WHERE tag.name = 'arsenal' 

EDIT:

Cela fonctionne:

SELECT thread.content 
FROM tag 
JOIN thread_tags ON tag.id = thread_tags.tag_id 
JOIN thread ON thread.id = thread_tags.thread_id 
WHERE tag.name = 'tagged' 
LIMIT 0 , 30 

Cependant chaque fois que je tente de joindre les auteurs avec leurs fils, il jette # 1066 erreurs .

Répondre

0

Vous avez joint deux fois la table tag (erreur) et n'avez pas rejoint le tableau thread.

SELECT thread.content, author.username 
FROM tag 
    JOIN thread_tags 
    ON tag.id = thread_tags.tag_id 
    JOIN thread         --join thread (not tag again) 
    ON thread.id = thread_tags.thread_id 
    JOIN author_threads 
    ON author_threads.thread_id = thread.id  --error here too, in your query 
    JOIN author 
    ON author.id = author_threads.thread_id  --error here too, in your query 
WHERE tag.name = 'arsenal' 
+0

Accepter que l'un des 'tag's devrait être' thread', mais je pense qu'il doit être le premier. (Vous pouvez voir cela du fait que 'thread 'est référencé dans la première condition de jointure.) –

+0

@Andriy: oui, si nous voulons effectuer les changements minimum (et la requête fonctionne!), Nous devrons changer le premier 'tag' ->' thread' et d'échanger les deux dernières conditions «ON ...'. –

0

pourquoi avez-vous une table de tag dans votre JOIN? c'est pourquoi vous obtenez l'erreur:

JOIN tag ON thread_tags.tag_id = tag.id 

vous avez également balise table ici:

FROM tag 

table tag est apparu deux fois.

0

Vous avez le tableau des tags deux fois dans votre requête. Peut-être que c'est le problème.

+0

Que devrait-il en être autrement? –

0
SELECT thread.content, author.username 
FROM thread 
LEFT JOIN thread_tags ON thread.id = thread_tags.thread_id 
LEFT JOIN tag ON thread_tags.tag_id = tag.id 
LEFT JOIN author_threads ON author.id = author_threads.author_id 
LEFT JOIN author ON author_threads.thread_id = thread.id 
WHERE tag.name = 'arsenal' 

BTW - est-il pas mieux de stocker author_id`` in thread` table?

+0

"* n'est-il pas préférable de stocker' author_id' dans la table 'thread'? *". Pas si un thread peut avoir plusieurs auteurs, comme c'est suggéré par la structure des tables. –

+0

# 1054 - Colonne inconnue 'author.id' dans 'on clause' –

Questions connexes