Ограничить 10 записей из сообщений для каждой категории [дубликат]


На этот вопрос уже есть ответ здесь:

У меня есть две таблицы categories и posts, я не хочу получать все записи для каждой категории. Я хочу получить ограниченные строки из каждой категории.

categories Таблица, как показано ниже :-

  1. ID
  2. имя
  3. слизняк

posts таблица, как показано ниже: -

  1. ID [PK ]
  2. название
  3. слизняк
  4. содержание
  5. Категория [ключ-внешний ключ]
  6. publish_date
Я пытаюсь добиться того, что хочу получить 10 записей из posts для каждой category.

То, что я делаю в данный момент, настолько опасно, что оно запускает много запросов, я хочу свести его к 1 запросу.

<?php

    $fetchCat = $mysqli->query("SELECT * from categories");
    while($row = $fetchCat->fetch_assoc()) {
        $fetchPost = $mysqli->query("SELECT id, title, slug from posts where category=".$mysqli->real_escape_string($row['id'])." limit 10");
        // Processing my code.
    }
?>

Могу ли я есть какой-то запрос" inner join", который может уменьшить мой запрос до 1-2 запросов и получить те же результаты, что и выше ?

Я хочу иметь 10 статей для каждой категории, которые будут выбраны. В будущем у меня может быть 40-45 категорий, и для каждой категории , в среднем, у меня может быть 80-90 должностей. При выборке всех постов для категории 40-45 из вышеприведенного метода, можете взять мою заявку на каботажное судно. Поэтому мне нужен какой-то реальный метод, где я могу ограничить свои записи постов для каждой категории 40-45.

Это не так. простое внутреннее соединение, где я выбираю сообщения, но это фактически ограничивает внутренние записи соединения для отображения для каждой родительской таблицы.

1 3

1 ответ:

Я наконец нашел решение в запросе 2. Улучшений было немного.

1-й запрос, я побежал за категорией и сохранил их в массиве.

$cat_array = array();
$fetchCat = $mysqli->query("SELECT * from categories");
while($rowCat = $fetchCat->fetch_assoc()) {
   // Category processing....
}

Второй запрос , я побежал против post, используя group_concat и SUBSTRING_INDEX, чтобы получить 10 записи каждой категории.

$post_array = array();
$fetchPost = $mysqli->query("select category, 
             SUBSTRING_INDEX(group_concat(id), ',', 10) as post_id, 
             SUBSTRING_INDEX(group_concat(title), ',', 10) as post_title, 
             SUBSTRING_INDEX(group_concat(slug), ',', 10) as post_slug from posts 
             group by category;");

while($rowPost = $fetchPost->fetch_assoc()) {
    $post_array[ $rowPost['category'] ] [id] = $rowPost['post_id'];
    $post_array[ $rowPost['category'] ] [title] = $rowPost['post_title'];
    $post_array[ $rowPost['category'] ] [slug] = $rowPost['post_slug'];
}

2 запрос и все необходимые данные [categories табличные данные, 10 posts табличные данные из каждой категории]

Мне пришлось сделать несколько взрывов для post_id , post_title, post_slug и использовать его в моем приложении.

Теперь, к получить список всех названий и слагов для любой категории, было просто, например, для категории id "1" все, что мне нужно было сделать, это : -

$post_array[1][id]  // Returns all post_id associated with category 1.

Большое спасибо за @billynoah, за то, что указал мне направление "групповой мудрости"," AsConfused " за то, что прошел мой запрос и дал мне знать, что команда analyze table posts тоже есть.

Спасибо