#SQL
Bitrix: Пакетное выполнение SQL скриптов
/** * @param $pathToScript * $pathToScript = $_SERVER["DOCUMENT_ROOT"]."/local/modules/[modname]/install/sql/b_table.sql"; * */ protected function runSqlScript($pathToScript){ global $DB; $arErrors = $DB->RunSqlBatch($pathToScript); return $arErrors; }
Нативная выборка свойства строка
Нативная выборка свойства строка из таблицы инфоблоков
select e.ID as ORDER_ID, biep.VALUE EMAIL from b_iblock_element e INNER JOIN b_iblock_element_property biep ON e.ID = biep.IBLOCK_ELEMENT_ID WHERE e.IBLOCK_ID=11 AND biep.IBLOCK_PROPERTY_ID = 36
Выборка свойства типа привязка к элементу одиночная
select e.ID as ORDER_ID, biep.VALUE from b_iblock_element e INNER JOIN b_iblock_element_property biep ON e.ID = biep.IBLOCK_ELEMENT_ID WHERE e.IBLOCK_ID=11 AND biep.IBLOCK_PROPERTY_ID = 46
Выборка множественного свойства привязка к элементу
select e.ID as ORDER_ID, biep.VALUE, e2.NAME from b_iblock_element e INNER JOIN b_iblock_element_property biep ON e.ID = biep.IBLOCK_ELEMENT_ID INNER JOIN b_iblock_element e2 ON e2.ID = biep.VALUE WHERE e.IBLOCK_ID=11 AND biep.IBLOCK_PROPERTY_ID = 49
Bitrix: Запросы к БД
Запросы к БД
use Bitrix\Main\Application; use Bitrix\Main\Diag\Debug; $record = Application::getConnection() ->query("select 1+1;") ->fetch(); Debug::writeToFile($record);
SQL: Важность учёта
Задачка: Важность учёта
Дана таблица поступлений товаров на склады компании следующего формата:
create table incoming ( storage_id integer not null, category_id integer not null, quantity integer not null, time datetime not null );
Напишите запрос, который выведет список последнего поступившего количества для каждого склада и категории товара. Таблица должна быть отсортирована по номеру склада (по возрастанию) и категории товара (по возрастанию). Например, для следующей таблицы:
storage_id | category_id | quantity | time ----------------------------------------------------- 1 | 32 | 3 | 2015-03-17 13:55:32 1 | 32 | 8 | 2015-03-17 13:15:22 3 | 32 | 23 | 2015-03-17 14:45:57 1 | 7 | 13 | 2015-03-17 15:56:12 1 | 32 | 7 | 2015-03-17 17:05:37 2 | 17 | 1 | 2015-03-18 13:13:22 1 | 7 | 13 | 2015-03-19 21:53:17
запрос должен возвращать
storage_id | category_id | quantity ---------------------------------------------- 1 | 7 | 13 1 | 32 | 7 2 | 17 | 1 3 | 32 | 23
Решение
select storage_id,category_id,quantity from (select *, DATE_FORMAT(`time`,'%Y%m%d%H') as sortOnTime, CONCAT(DATE_FORMAT(`time`,'%Y%m%d'), storage_id ) as days from incoming ORDER BY sortOnTime DESC )s GROUP BY days ORDER BY storage_id , category_id
в запросах для production запросы вида select *,.. лучше не использовать а перечислять жёстко все необходимые поля
SQL: JOINS объяснения и тонкости
JOIN
выборки с объединениями справа и слева одни из любимых вопросов которые задают соискателям на технических интервью.
Левый
SELECT * FROM authors a LEFT JOIN rooms r ON a.`room-id`=r.id
в таблице authors я сделал имя поле room-id через дефис, чего в реальной практике проектирования баз данных я бы категорически не делал.
одна из причин что в нативных запросах вам придётся каждый раз оборачивать имя этого поля в `- апострофы.
Правый
SELECT * FROM authors a RIGHT JOIN rooms r ON a.`room-id`=r.id
Прямое связываение через WHERE и без JOIN
SELECT * FROM authors a, rooms r WHERE a.`room-id` = r.id
Bitrix d7 создание таблицы
public static function createTable(){ $connection = Application::getInstance()->getConnection(); if (!$connection->isTableExists(static::getTableName())) { static::getEntity()->createDbTable(); return true; } else return false; } public static function dropTable(){ $connection = Application::getInstance()->getConnection(); $connection->dropTable(static::getTableName()); return true; }
Описание таблиц битрикса
- b_catalog_group — типы цен
- b_catalog_price — цены товаров
- b_catalog_product — товар как сущность