2010-06-23 8 views
0

J'ai 3 tables dans ma base de données MySQL:Obtenir les discussions liées aux tags

  • la table Threads (id, titre)
  • la table Tags (id, nom)
  • les ThreadTags de tableau croisé dynamique (tagID, threadID)

Admettons que je possède déjà les ID de balises dans le tableau $ tagIDs, maintenant je veux que tous les threads soient liés à TOUS ces balises. Ma solution actuelle est quelque chose comme ça:

$stmt = 'SELECT id, title FROM Threads'."\n"; 

foreach($tagIDs as $id) { 
    $stmt .= 'INNER JOIN ThreadTags T1 ON (T1.threadID = Thread.id AND T1.tagID = '.$id.')'."\n"; 
} 

Et un certain nombre de balises ajouter une autre INNER JOIN à cette table.
Y a-t-il un meilleur moyen?
NB: s'il vous plaît, pas de réponse comme « utiliser une base de données NoSQL », je ne peux pas changer cela, grâce

Répondre

1

Je pense que cela pourrait fonctionner <, je ne l'ai pas testé ce que parce que je n'ai pas base de données à proximité.
Cela ne fonctionne pas (voir commentaires)

sort($tagIDs, SORT_NUMERIC);  
$tagIDs = implode(',', $tagIDs); // This gives you a string '1,2,5,19' 

$stmt = 'SELECT id, title, GROUP_CONCAT(T1.tagID ORDER BY T1.tagid ASC) as threadtags FROM Threads INNER JOIN 
ThreadTags T1 ON T1.threadID 
WHERE threadtags LIKE \'%' . $tagIDs . '%\' 
GROUP BY Threads.id'; 
+0

Ne pas faire ce que je veux, il me donnera tout fil lié à au moins l'une des balises, je ne veux que les discussions liées à tous les tags (précisée dans la question). –

+0

Désolé, je l'ai mal lu. Je ferais probablement comme tu l'as fait. Cependant, si vous souhaitez approfondir ce sujet, vous pouvez peut-être jeter un coup d'œil à la fonction GROUP_CONCAT de mysql: http://dev.mysql.com/doc/refman/5.0/fr/group-by-functions.html#function_group- concat je pense que c'est possible, je vais vérifier dans un peu, si je trouve quelque chose je vais mettre à jour la réponse. – klennepette

+0

Merci. C'est intéressant. Toute idée de la différence de performance? –

Questions connexes