@maxdit

Связанный вывод с двух таблиц?

Здравствуйте, натолкните на мысль либо дайте пожалуйста пример или ссылку на мануал, как реализовать такой функционал:
MySQL:
У нас есть две таблицы:
category(категории, имеет столбцы - id и name)
order(статьи, имеет столбцы - id, name и category_id)
Хочу реализовать вот такой вывод:
К примеру в таблице category есть три записи(3 категории)
id - 1, name - Природа
id - 2, name - Еда
id - 3, name - Спорт
А в таблице order есть тоже 3 записи (3 статьи)
id - 1, name - В мире животных, category_id - 1
id - 2, name - Как сделать вкусный салат, category_id - 2
id - 3, name - Методы похудения, category_id - 3
Нужно чтоб выводилось на одной странице вот так
1) Природа
- В мире животных
2) Еда
- Как сделать вкусный салат
3) Спорт
- Методы похудения
---------------------------
То есть чтоб на одной странице выводились все категории и статьи к которым они привязаны.
Заранее огромное спасибо!
  • Вопрос задан
  • 5148 просмотров
Пригласить эксперта
Ответы на вопрос 4
rishatss
@rishatss
Simple Developer ^)
https://www.w3schools.com/sql/sql_join_inner.asp

Использую таблицы caregory и orders. Связываю их по category_id


MySQL
SELECT category.name, orders.name
FROM category
INNER JOIN orders
ON category.category_id=orders.category_id
ORDER BY category.name;


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

-- phpMyAdmin SQL Dump
-- version 4.6.5.2
-- https://www.phpmyadmin.net/
--
-- Хост: 127.0.0.1:3306
-- Время создания: Фев 27 2017 г., 22:58
-- Версия сервера: 5.7.16
-- Версия PHP: 7.1.0

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- База данных: `test`
--

-- --------------------------------------------------------

--
-- Структура таблицы `categories`
--

CREATE TABLE `categories` (
  `id` int(10) UNSIGNED NOT NULL,
  `title` varchar(255) NOT NULL,
  `parent` int(10) UNSIGNED NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Дамп данных таблицы `categories`
--

INSERT INTO `categories` (`id`, `title`, `parent`) VALUES
(1, 'Природа', 0),
(2, 'Еда', 0),
(3, 'Спорт', 0),
(4, 'В мире животных', 1),
(5, 'Как сделать вкусный салат', 2),
(6, 'Свое', 2),
(20, 'Методы похудения', 3);

--
-- Индексы сохранённых таблиц
--

--
-- Индексы таблицы `categories`
--
ALTER TABLE `categories`
  ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT для сохранённых таблиц
--

--
-- AUTO_INCREMENT для таблицы `categories`
--
ALTER TABLE `categories`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=21;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;


PHP скрипт
<?php

//Устанавливаем кодировку и вывод всех ошибок
header('Content-Type: text/html; charset=UTF-8');
error_reporting(E_ALL);

//Объектно-ориентированный стиль
$mysqli = new mysqli('localhost', 'rishat', 'rishat', 'test');

//Устанавливаем кодировку utf8
$mysqli->query("SET NAMES 'utf8'");

/*
 * Это "официальный" объектно-ориентированный способ сделать это
 * однако $connect_error не работал вплоть до версий PHP 5.2.9 и 5.3.0.
 */
if ($mysqli->connect_error) {
    die('Ошибка подключения (' . $mysqli->connect_errno . ') '
            . $mysqli->connect_error);
}

/*
 * Если нужно быть уверенным в совместимости с версиями до 5.2.9,
 * лучше использовать такой код
 */
if (mysqli_connect_error()) {
    die('Ошибка подключения (' . mysqli_connect_errno() . ') '
            . mysqli_connect_error());
}

//Получаем массив нашего меню из БД в виде массива
function getCat($mysqli){
	$sql = 'SELECT * FROM `categories`';
	$res = $mysqli->query($sql);

	//Создаем масив где ключ массива является ID меню
	$cat = array();
	while($row = $res->fetch_assoc()){
		$cat[$row['id']] = $row;
	}
	return $cat;
}

//Функция построения дерева из массива от Tommy Lacroix
function getTree($dataset) {
	$tree = array();

	foreach ($dataset as $id => &$node) {    
		//Если нет вложений
		if (!$node['parent']){
			$tree[$id] = &$node;
		}else{ 
			//Если есть потомки то перебераем массив
            $dataset[$node['parent']]['childs'][$id] = &$node;
		}
	}
	return $tree;
}

//Получаем подготовленный массив с данными
$cat  = getCat($mysqli); 

//Создаем древовидное меню
$tree = getTree($cat);

//Шаблон для вывода меню в виде дерева
function tplMenu($category){
	$menu = '<li>
		<a href="#" title="'. $category['title'] .'">'. 
		$category['title'].'</a>';
		
		if(isset($category['childs'])){
			$menu .= '<ul>'. showCat($category['childs']) .'</ul>';
		}
	$menu .= '</li>';
	
	return $menu;
}

/**
* Рекурсивно считываем наш шаблон
**/
function showCat($data){
	$string = '';
	foreach($data as $item){
		$string .= tplMenu($item);
	}
	return $string;
}

//Получаем HTML разметку
$cat_menu = showCat($tree);

//Выводим на экран
echo '<ul>'. $cat_menu .'</ul>';

?>
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
введите в каждую таблицу parentID - и вопрос решится.
Ответ написан
Комментировать
@lem_prod
сам скрипт писать не буду, опишу логику, получаешь с БД связанную таблицу, ссылку на JOIN уже выше кинули.
у тебя будет массив, в котором каждая строка будет знать категорию и свое название.
потом нужно сделать индексацию по категории, что бы массив в ключах имел категории, а в значениях массив значений.
и под конец делаешь foreach по категориям, а внутри его foreach по значениям и собственно отрисовуешь
Ответ написан
@gimade
Вариант 1:
select category.name, order.name from category inner join order on category.id = order.id;

Вариант 2:
select category.name as category_name, order.name as order_name from category inner join order on category.id = order.id;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы