Объединение таблиц в вопросе MySQL (php) - PullRequest
0 голосов
/ 18 января 2010

Ситуация:

В моей базе данных есть таблица с именами ' исполнителей ' и ' тегов '.

У каждого исполнителя есть набор тегов, сохраненных в таблице ссылок ' artisttags '.

Каждый уникальный тег сохраняется в таблице с именем ' tags '.

Задача

Я хочу показать всем исполнителям, у которых есть один (или несколько) тегов общего с указанным исполнителем.

function getSimilarArtists($artist_id)
{
   $sql = "SELECT ...";
   $query = mysql_query($sql);
   while($artist = mysql_fetch_assoc($query))
   {
       $html .= "<li>".$artist['name']."</li>"    
   }
   print($html);
}

Столы

исполнители

id | name

artisttags

id | artist_id | tag_id    

теги

id | tag_name

Любая помощь приветствуется.

Спасибо

Ответы [ 2 ]

3 голосов
/ 18 января 2010

Эти внешние объединения в ответе Mitosz действительно повредят - и будут возвращать каждого художника, а не только тех, у кого «один (или более) общий тег». Вместо этого используйте внутренние соединения

SELECT similar.name, count(*) as commontags
FROM artists current, 
  artisttags curtags,
  artisttags simtags,
  artists similar
WHERE current.id=curtags.artist_id
  AND curtags.tag_id=simtags.tag_id
  AND simtags.artist_id=similar.id
ORDER BY count(*) DESC;

Конечно, для более разумной системы индексации вы можете применить оценку к каждому тегу в таблице тегов (например, на основе голосов пользователей или количества элементов) и отсортировать результаты по SUM (tag.score).

2 голосов
/ 18 января 2010
SELECT DISTINCT a.name FROM artisttags at
LEFT JOIN artisttags at2
ON at2.tag_id = at.tag_id
LEFT JOIN artists a
ON at2.artist_id = a.id
WHERE at.id = '$artist_id'
...