2016-10-30 4 views
0

Я использую MySQL/PHP для хранения моих данных.Проблемы SQL с функцией объединения

У меня есть сайт с сообщениями, и я хотел был бы иметь возможность заказать их по тегам. (Посты имеют несколько тегов)

Есть 3 стола.

Medias (сообщений)

+----+--------+-----+ 
| id | title | ... | 
+----+--------+-----+ 
| 1 | hello | ... | 
| 2 | hi  | ... | 
+----+--------+-----+ 

теги

+----+------+-----+ 
| id | name | ... | 
+----+------+-----+ 
| 1 | red | ... | 
| 2 |square| ... | 
+----+------+-----+ 

medias_tags (Для того, чтобы связать Medias & теги вместе)

+----+----------+--------+ 
| id | media_id | tag_id | 
+----+----------+--------+ 
| 1 |  1 |  1 | 
| 2 |  1 |  2 | 
| 3 |  2 |  2 | 
+----+----------+--------+ 

Итак, я использую этот SQL-запрос для объединения таблиц и вывода сообщения с определенным тегом.

$req_mda_list = $bdd->query('SELECT * FROM medias 
JOIN medias_tags 
ON medias.id=medias_tags.media_id 
WHERE medias_tags.tag_id ='.$tag_id.' 
ORDER BY date DESC 
LIMIT '.$start.','.$limit); 

Он работает однако когда я делаю другой запрос SQL внутри для того, чтобы получить другие тег каждой должности (Столбики имеют несколько тегов) это не работает. Я попытался перевернуть запросы, но я не получаю никаких данных из запроса или случайных тегов.

$data_mda = $req_mda_list->fetch()){ 

$req_mda_tags = $bdd->prepare('SELECT * FROM medias_tags WHERE media_id = ?'); 
$req_mda_tags->execute(array($mda_id));  

$mda_tags_list = null; 

while ($data_mda_tags = $req_mda_tags->fetch()){ 
    $tag_id = $data_mda_tags['tag_id']; 

    $req_tag_name = $bdd->prepare('SELECT * FROM tags WHERE id = ?'); 
    $req_tag_name->execute(array($tag_id)); 
    $data_tag_name = $req_tag_name->fetch(); 

    $mda_tags_list .= $data_tag_name['name'].' '; 
} 

#Show media title 

echo $mda_tags_list; 

} 
+0

Что вы ожидаете, когда сообщения сортируются по тегам? Как их сортировать? –

+0

Вы пытались добавить '$ req_mda_tags-> store_result();' after' $ req_mda_tags-> execute (array ($ mda_id)); '? –

+0

@YuryFedorov Они должны быть отсортированы с заголовком сообщения и связанными с ним тегами – casusbelli

ответ

0

Итак, вы хотите, чтобы перечислить имена всех тэгов, связанных с medias?.

У MySQL есть встроенная функция, называемая GROUP_CONCAT. Вы можете использовать это, чтобы получить все имена тегов в одном запросе.

SELECT m.media_id, GROUP_CONCAT(t.name SEPARATOR ' ') AS tag_names 
FROM media_tags m 
INNER JOIN tags t ON m.tag_id = t.id 
GROUP BY m.media_id 

Если вы хотите, чтобы получить список тегов только на media_id, вы можете просто добавить предложение WHERE.

SELECT m.media_id, GROUP_CONCAT(t.name SEPARATOR ' ') AS tag_names 
FROM media_tags m 
INNER JOIN tags t ON m.tag_id = t.id 
WHERE m.media_id = ? 
GROUP BY m.media_id 
0

Это то, что вы ищете?

select  m.title 
      ,t.name 

from     medias_tags mt 

      join  media  m 

      on   m.media_id = mt.media_id 

      join  tags  t 

      on   t.tag_id = mt.tag_id 

order by m.title 
      ,t.name 
; 

или этот? -

select  m.title 
      ,group_concat(t.name order by t.name) as tags 

from     medias_tags mt 

      join  media  m 

      on   m.media_id = mt.media_id 

      join  tags  t 

      on   t.tag_id = mt.tag_id 

group by m.title 

order by m.title 
; 
Смежные вопросы