https://www.w3schools.com/sql/sql_join_inner.asp
Использую таблицы caregory и orders. Связываю их по category_idMySQLSELECT 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>';
?>