Заметки кодящего дизайнера

Как выбрать строки в MySQL

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

Выведем все строки и столбцы из определённой таблицы:

SELECT * 
FROM `t_product` 

Но строк может быть очень много. Ограничим выбор:

SELECT * 
FROM `t_product` 
LIMIT 24;

Также могут быть нужны не все столбцы, в таком случае имеет смысл напрямую указать какие столбцы мы хотим видеть в выводе:

SELECT product_id, model, manufacturer_id, price, date_added, date_modified 
FROM `t_product` 
LIMIT 24;

Отлично! Уже чище. Попробуем теперь добавить сортировку. Например, посмотреть недавно отредактированные товары.

SELECT product_id, model, manufacturer_id, price, date_added, date_modified
FROM `t_product`
ORDER BY date_modified DESC
LIMIT 24;

Дальше можно дополнить запрос условием. Например, выбрать недавно добавленные товары производителя с manufacturer_id = 54.

SELECT product_id, model, manufacturer_id, price, date_added, date_modified
FROM `t_product`
WHERE manufacturer_id = 54
ORDER BY date_added DESC
LIMIT 24;

Хорошо. А если для выбора строк нужно смотреть в две таблицы? Например, мы хотим узнать название позиции name с известным артикулом model. Но дело в том, что name лежит в таблице t_product_description, а model в таблице t_product, а соединяет их product_id.

Есть два способа сделать это.

Первый — использовать подзапрос:

SELECT product_id, name
FROM `t_product_description`
WHERE product_id IN (SELECT product_id FROM `t_product` WHERE model = 'ЗНАЧЕНИЕ_МОДЕЛИ');

Второй — использовать соединение таблиц. Этот способ, во-первых, в большинстве случаев оптимальнее, а во-вторых позволяет делать составной вывод.

Например, вывести общий для обеих таблиц product_id из таблицы t_product_description взять name, а из таблицы t_product вывести model и price.

Например, зная model из таблицы product_id сделаем следующий составной вывод: 1) product_id, общий для двух таблиц; 2) model; 3) price из таблицы t_product; 4) name из таблицы t_product_description.

SELECT 
    p.product_id, 
    p.model, 
    p.price, 
    pd.name
FROM 
    t_product AS p
INNER JOIN 
    t_product_description AS pd 
ON 
    p.product_id = pd.product_id
WHERE 
    p.model = 'ЗНАЧЕНИЕ_МОДЕЛИ';

И следом добавлю пример комбинации внешнего запроса и подзапроса с соединением таблиц.

Например, нам надо получить 50 недавно добавленных товаров и следом отсортировать их по модели.

SELECT *
FROM (
    SELECT 
        p.product_id, 
        p.model, 
        pd.name,
        p.date_added
    FROM 
        t_product AS p
    INNER JOIN 
        t_product_description AS pd 
    ON 
        p.product_id = pd.product_id
    ORDER BY p.date_added DESC
    LIMIT 50
) AS subquery
ORDER BY model;