Запрос mysql на выборку из двух таблиц

227
08 апреля 2017, 00:30

Есть две табицы: category и news. Нужно сделать выборку чтобы показывало 5 новостей каждой категори. Этот запос показывает все новости.

SELECT category.category, news.title FROM category, news WHERE news.category_id=category.id 

А нужно: чтобы на сайте выводилось в таком поряде. пример:

  1. Категория1

  2. новость 1

  3. новость 2
  4. новость 3

  5. Категория 2

  6. новость 1

  7. новость 2
  8. новость 3 и так далее...
Answer 1
set @rank = 0;
set @cursec = -1;
select * from (
select s.name sname, e.name ename, 
  (IF (@cursec != s.id,(@rank := 1),(@rank := @rank + 1))) RANK,
  @cursec := s.id CURSEC
from sect s
  left join elem e on e.sec = s.id
order by s.id,e.id
) T where rank <= 2;
Answer 2

Одним запросом не получится. Первым запросом выбираете категории, запоминаете их в список. Потом идете циклом по этому списку и выбираете новости данной категории с добавлением к запросу LIMIT 5. Это ограничит выборку 5 новостями. По какому принципу вы их будете сортировать - дело ваше. Выводите это всё на страницу.

Answer 3

Выберите все категории и новости в нужном порядке, оберните результат в подзапрос, добавьте к нему счётчик и пронумеруйте новости отдельно для каждой категории, а затем просто оставьте нужные вам.

Пример для LIMIT 2 (меняйте по своему усмотрению на 5 или любой другой):

SELECT
  t.*,
  @newsNum := IF(t.id != @prevCatId, 1, @newsNum + 1) n,
  @prevCatId := t.id
FROM (
  SELECT c.id, c.category, n.title
  FROM _category c
  INNER JOIN _news n ON n.category_id = c.id
  ORDER BY c.id, n.id
) t
INNER JOIN (SELECT @prevCatId := 0, @newsNum := 0) counters
HAVING n < 3;

Результат (лишние поля скрыл):

1    sport    news 1.1
1    sport    news 1.2
2    cinema   news 2.1
2    cinema   news 2.2
3    music    news 3.1
3    music    news 3.2

Для отладки использовал такие временные таблицы:

CREATE TEMPORARY TABLE _category(id int, category char(8))
  SELECT 1 id, 'sport'  category UNION
  SELECT 2 id, 'cinema' category UNION
  SELECT 3 id, 'music'  category
;
CREATE TEMPORARY TABLE _news(id int, category_id int, title char(16))
  SELECT 1 id, 1 category_id, 'news 1.1' title UNION
  SELECT 2 id, 1 category_id, 'news 1.2' title UNION
  SELECT 3 id, 1 category_id, 'news 1.3' title UNION
  SELECT 4 id, 2 category_id, 'news 2.1' title UNION
  SELECT 5 id, 2 category_id, 'news 2.2' title UNION
  SELECT 6 id, 2 category_id, 'news 2.3' title UNION
  SELECT 7 id, 3 category_id, 'news 3.1' title UNION
  SELECT 8 id, 3 category_id, 'news 3.2' title UNION
  SELECT 9 id, 3 category_id, 'news 3.3' title
;
READ ALSO
Регулярные выражения C++

Регулярные выражения C++

Имеется следующий код:

203
Ошибка при чтении символов из строки

Ошибка при чтении символов из строки

Пытаясь делать курсач застрял вот на таком моменте: Вот скрин кансоли на каком месте остановилась прога: А делаю я решение системы линейных...

406
Динамическое добавление html в dom с помощью JS

Динамическое добавление html в dom с помощью JS

Есть такой кодВ данном случае я вручную создаю каждую ячейку,заполняю ее и вставляю в ряд

242