Как с помощью sql сделать запрос сразу к нескольким таблицам?

23

Добрый день.

Вопрос следующий: можно ли подряд пользоваться оператором 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>";
}
php
mysql
sql

5 ответов

6

Вот пример 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 */;
4

Используйте JOIN для объединения 2х или более таблиц.

2

Я скопировал этот код и мне выдало:

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\kinomonster\index.php on line 24

1

что то все равно не получается. Это в одном SELECTе должно быть? 

3

Спасибо, теперь все поняла, все заработало )

Sign up or Log in to write an answer