Как выбрать строки в 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;