Как с помощью sql сделать запрос сразу к нескольким таблицам?
Добрый день.
Вопрос следующий: можно ли подряд пользоваться оператором SELECT и как? По заданию необходимо взять данные из одной таблицы вставить в основную и вывести в php. Но если мне надо взять данные сразу из 2 таблиц, допустим описание из таблицы с описаниеv, категорию из таблицы категории, и после этого вывести единую таблицу. Я думала как то так можно, но не работает.
Курс PHP, задание 59
$query = $mysqli->query('SELECT * FROM `categorii` INNER JOIN movie ON movie.categorii_id = categorii.id');
$query = $mysqli->query('SELECT * FROM `description` INNER JOIN movie ON movie.description_id = description.id');
while ($row = mysqli_fetch_assoc ($query)) {
echo $row['name'].$row['year'].$row['description'].$row['categorii']."<br>";
}
5 ответов
Вот пример Join (объединение нескольких таблиц с помощью PHP):
<?php
//Соединение
$mysqli = new mysqli('localhost', 'root', '', 'kinomonster');
if(mysqli_connect_errno()) {
printf("Соединение не устоновлено", mysqli_connect_error());
exit();
}
$mysqli->set_charset('utf8');
$query = $mysqli->query("SELECT * FROM `categories`
INNER JOIN movie ON movie.category_id = categories.id
INNER JOIN discriptions ON movie.discriptions_id = discriptions.id"
);
?>
<?php
/**
* Альтернативный синтаксис написания цикла WHILE
* МАНУАЛ PHP на эту тему: http://php.net/manual/ru/control-structures.while.php
*/
while($row = mysqli_fetch_assoc($query)): //Двоеточие вместо скобки
?>
<!-- Удобнее верстать есть вы отделяете переменные короткими записями <?php ?> как в примере ниже -->
<b><?php echo $row['name']; ?></b> <br>
<?php echo $row['discriptions']; ?> <br>
<?php echo $row['categories']; ?> <br><br>
<?php
endwhile; /* Завершает цикл while, вместо скобки. */
$mysqli->close();
?>
SQL-Dump:
-- phpMyAdmin SQL Dump
-- version 4.5.1
-- http://www.phpmyadmin.net
--
-- Хост: 127.0.0.1
-- Время создания: Июль 25 2018 г., 20:44
-- Версия сервера: 10.1.9-MariaDB
-- Версия PHP: 5.6.15
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(4) NOT NULL,
`categories` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Дамп данных таблицы `categories`
--
INSERT INTO `categories` (`id`, `categories`) VALUES
(1, 'Фильмы'),
(2, 'Сериалы');
-- --------------------------------------------------------
--
-- Структура таблицы `discriptions`
--
CREATE TABLE `discriptions` (
`id` int(4) NOT NULL,
`discriptions` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Дамп данных таблицы `discriptions`
--
INSERT INTO `discriptions` (`id`, `discriptions`) VALUES
(1, '«Матрица» — культовый научно-фантастический боевик, снятый братьями Вачовски, с участием Киану Ривза, Лоуренса Фишборна, Керри-Энн Мосс и Хьюго Уивинга. '),
(2, '«Интерстéллар» — научно-фантастический фильм режиссёра Кристофера Нолана по сценарию Джонатана Нолана и физика-теоретика Кипа Торна.'),
(3, '«Во все тяжкие» — культовый американский телесериал, созданный Винсом Гиллиганом');
-- --------------------------------------------------------
--
-- Структура таблицы `movie`
--
CREATE TABLE `movie` (
`id` int(5) NOT NULL,
`name` varchar(255) NOT NULL,
`discriptions_id` tinyint(4) NOT NULL,
`year` int(4) NOT NULL,
`add_date` datetime NOT NULL,
`category_id` tinyint(4) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Дамп данных таблицы `movie`
--
INSERT INTO `movie` (`id`, `name`, `discriptions_id`, `year`, `add_date`, `category_id`) VALUES
(1, 'Матрица', 1, 1999, '2016-02-08 20:36:00', 1),
(2, 'Интерстеллар', 2, 2014, '2016-02-09 19:41:00', 1),
(3, 'Во все тяжкие', 3, 2008, '2016-02-23 12:19:00', 2);
--
-- Индексы сохранённых таблиц
--
--
-- Индексы таблицы `categories`
--
ALTER TABLE `categories`
ADD PRIMARY KEY (`id`);
--
-- Индексы таблицы `discriptions`
--
ALTER TABLE `discriptions`
ADD PRIMARY KEY (`id`);
--
-- Индексы таблицы `movie`
--
ALTER TABLE `movie`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT для сохранённых таблиц
--
--
-- AUTO_INCREMENT для таблицы `categories`
--
ALTER TABLE `categories`
MODIFY `id` int(4) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
--
-- AUTO_INCREMENT для таблицы `discriptions`
--
ALTER TABLE `discriptions`
MODIFY `id` int(4) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;
--
-- AUTO_INCREMENT для таблицы `movie`
--
ALTER TABLE `movie`
MODIFY `id` int(5) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;
/*!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 */;
Используйте JOIN для объединения 2х или более таблиц.
Я скопировал этот код и мне выдало:
Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\kinomonster\index.php on line 24
что то все равно не получается. Это в одном SELECTе должно быть?
Спасибо, теперь все поняла, все заработало )