Урок 30: Работа с JOIN на PHP

Сегодня на 30-ом уроке мы погрузимся в одну из тем работы с базами данных, это объединение таблиц с помощью JOIN. Если вы мечтаете стать полноценным backend-разработчиком, этот урок станет вашим ключом к пониманию сложных запросов.

Зачем нужно объединение таблиц?

Представьте, что вы создаёте интернет-магазин. У вас есть таблица users (пользователи) и orders (заказы). Каждый заказ связан с пользователем через его user_id. Но как вывести список всех заказов с именами пользователей? Вот здесь и пригодится JOIN!

Объединение таблиц позволяет:

  • Избежать дублирования данных (например, не хранить имя пользователя в каждой записи заказа).
  • Строить гибкие запросы, комбинируя данные из разных таблиц.
  • Оптимизировать структуру базы данных (это называется нормализацией).

Типы JOIN: INNER и LEFT

В SQL существует несколько типов объединений, но сегодня мы разберём два самых популярных: INNER JOIN и LEFT JOIN.

INNER JOIN

INNER JOIN возвращает только те строки, где есть совпадение в обеих таблицах. Например, если пользователь не сделал ни одного заказа, он не появится в результате.

Синтаксис:

SELECT столбцы
FROM таблица1
INNER JOIN таблица2 ON условие_соединения;

Пример:
Допустим, у нас есть таблицы:

  • users (id, name)
  • orders (id, user_id, product)

Запрос:

SELECT users.name, orders.product 
FROM users
INNER JOIN orders ON users.id = orders.user_id;

Этот запрос выведет имена пользователей и их заказы, но только для тех, у кого есть заказы.

LEFT JOIN

LEFT JOIN возвращает все строки из левой таблицы (первой в запросе), даже если в правой таблице нет совпадений. Если совпадений нет, поля из правой таблицы будут NULL.

Пример:
Мы хотим вывести всех пользователей, даже если у них нет заказов.

SELECT users.name, orders.product 
FROM users
LEFT JOIN orders ON users.id = orders.user_id;

Здесь в результате будут все пользователи. Если заказов нет, в колонке product будет NULL.

Практические примеры на PHP

Давайте реализуем эти запросы в PHP. Предположим, мы используем PDO для работы с базой данных.

Пример 1: INNER JOIN

<?php
try {
    $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
    $stmt = $pdo->prepare("
        SELECT users.name, orders.product 
        FROM users
        INNER JOIN orders ON users.id = orders.user_id
    ");
    $stmt->execute();
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC);

    echo "<h2>Список заказов:</h2>";
    echo "<table border='1'>";
    echo "<tr><th>Имя</th><th>Товар</th></tr>";
    foreach ($results as $row) {
        echo "<tr><td>{$row['name']}</td><td>{$row['product']}</td></tr>";
    }
    echo "</table>";
} catch (PDOException $e) {
    die("Ошибка: " . $e->getMessage());
}
?>

Пример 2: LEFT JOIN

<?php
$stmt = $pdo->prepare("
    SELECT users.name, orders.product 
    FROM users
    LEFT JOIN orders ON users.id = orders.user_id
");
// Остальной код аналогичен предыдущему примеру
?>

В этом случае в таблице будут все пользователи, включая тех, у кого product = NULL.

Практические задачи

Закрепим знания на реальных кейсах!

Задача 1: Количество заказов каждого пользователя

Напишите запрос, который выведет имя пользователя и количество его заказов. Используйте LEFT JOIN и GROUP BY.

Решение:

SELECT users.name, COUNT(orders.id) AS total_orders
FROM users
LEFT JOIN orders ON users.id = orders.user_id
GROUP BY users.id;

Задача 2: Пользователи без заказов

Найдите всех пользователей, которые не сделали ни одного заказа.

Решение:

SELECT users.name 
FROM users
LEFT JOIN orders ON users.id = orders.user_id
WHERE orders.id IS NULL;

Советы

  • Всегда проверяйте условие соединения (ON). Ошибка здесь может привести к некорректным данным или огромному количеству строк.
  • Используйте алиасы для таблиц, чтобы упростить запрос:
    SELECT u.name, o.product 
    FROM users AS u
    INNER JOIN orders AS o ON u.id = o.user_id;
  • Тестируйте запросы в консоли СУБД (например, phpMyAdmin), прежде чем встраивать их в код.

JOIN это мощный инструмент, без которого невозможно представить работу с реляционными базами данных. Практикуйтесь с разными типами соединений и скоро вы будете чувствовать себя уверенно даже в сложных запросах.

Хотите освоить PHP от основ до профессионального уровня? Перейти к полному курсу по PHP для начинающих

Поделиться статьей:
Поддержать автора блога

Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.

Персональные рекомендации
Оставить комментарий