Вывести новости с названиями категорий

162
18 сентября 2017, 04:49

Поставил себе задачку по php и mysql вывести список новостей и название категорий, к которым относятся эти самые новости.

Новость может принадлежать к нескольким категориям, к одной категории или вовсе без категории.

В БД есть три таблицы:

  1. news - id | title
  2. link - news_id | cat_id
  3. category - id | name | url

Делаю запрос:

SELECT n.*, l.*, c.* 
FROM news n 
LEFT JOIN link l ON (l.news_id = n.id) 
LEFT JOIN category c ON (c.id = l.cat_id) 
ORDER BY n.id ASC

И получаю результат:

    id |title               | news_id | cat_id | id | name         | url        |
    1  | Первая новость     | 1       | 1      | 1  | Политика     | politic    |   
    1  | Первая новость     | 1       | 2      | 2  | Криминал     | criminal   |   
    1  | Первая новость     | 1       | 3      | 3  | Общество     | obshes     |
    2  | Вторая новость     |         |        |    |              |            |
    3  | Третья новость     | 3       | 1      | 1  | Политика     | politic    |   
    4  | Четвертая новость  | 4       | 2      | 2  | Криминал     | criminal   |
    4  | Четвертая новость  | 4       | 4      | 4  | Новости мира | news-world |
    5  | Пятая новость      |         |        |    |              |            |

Как теперь в php обработать и вывести новости, допустим в таком формате:

Первая новость (Политика, Криминал, Общество)

Вторая новость ()

Третья категория (Политика) и т.д.

Answer 1

Постройте запрос с использованием GROUP_CONCAT:

SELECT n.title, 
    GROUP_CONCAT(c.name SEPARATOR ', ') as cname, 
    GROUP_CONCAT(c.url SEPARATOR ', ') as curl
FROM news n 
LEFT JOIN link l ON (l.news_id = n.id) 
LEFT JOIN category c ON (c.id = l.cat_id) 
GROUP BY n.title
ORDER BY n.id ASC

Вывести результат в php можно например так:

$full_list = mysql_query("
    SELECT n.title as title, 
        GROUP_CONCAT(c.name SEPARATOR ', ') as cname, 
        GROUP_CONCAT(c.url SEPARATOR ', ') as curl
    FROM news n 
    LEFT JOIN link l ON (l.news_id = n.id) 
    LEFT JOIN category c ON (c.id = l.cat_id) 
    GROUP BY n.title
    ORDER BY n.id ASC    
");
echo '<ul>';
while($entity = mysql_fetch_array($full_list))
{         
    echo '<li>'.$entity["title"].'('.$entity["cname"].')</li>'; 
}
echo '</ul>';
READ ALSO
Как Ускорить Запрос к БД?

Как Ускорить Запрос к БД?

У меня есть таблица на 30500 записейВ ней находятся города, районы, и всякие населенные пункты

165
Как прописать ссылку в htaccess?

Как прописать ссылку в htaccess?

Подскажите как прописать ссылку в htaccessне переключается постраничный вывод из файла , в браузере выводится ссылка, а на странице не переключается

191
разбор многомерного массива через foreach

разбор многомерного массива через foreach

Начинаю, изучать php и хочу сделать логирование ошибокПытаюсь разобрать функцию debug_backtrace(), и не могу понять из-за чего он не хочет брать [0] массив...

155
Автозавершение текста в TextBox по подстроке

Автозавершение текста в TextBox по подстроке

Мне понадобилось найти функцию, которая отображает подсказки в TextBox в виде списка подходящих строк (те

206