Ограничить 10 записей из сообщений для каждой категории [дубликат]
На этот вопрос уже есть ответ здесь:
У меня есть две таблицы categories
и posts
, я не хочу получать все записи для каждой категории. Я хочу получить ограниченные строки из каждой категории.
categories
Таблица, как показано ниже :-
- ID
- имя
- слизняк
posts
таблица, как показано ниже: -
- ID [PK ]
- название
- слизняк
- содержание
- Категория [ключ-внешний ключ]
- publish_date
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 ответ:
Я наконец нашел решение в запросе 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
табличные данные, 10posts
табличные данные из каждой категории]Мне пришлось сделать несколько взрывов для
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
тоже есть.Спасибо