Как получить все поля связанной сущности

Все вопросы/проблемы по установке и использовании.
Аватара пользователя
SalahievFR
Сообщения: 277
Зарегистрирован: 22 янв 2023, 10:14
Имя: Фанис Салахиев
Откуда: Россия Казань
Контактная информация:

Re: Как получить все поля связанной сущности

Сообщение SalahievFR »

remchik писал(а): 21 мар 2024, 10:39 Реально прикольная задача
Код не оптимизировал

Код: Выделить всё

BEGIN


    DECLARE n VARCHAR(200);
    DECLARE v VARCHAR(200);
		DECLARE vv VARCHAR(200);
		DECLARE i INT DEFAULT 2170;
		DECLARE done INT DEFAULT 0;

		DECLARE cur1 CURSOR FOR select id as idd,`name` as namem from app_fields where `name` <>''and entities_id = 26;
		DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
drop table if exists name_tmp;
 create temporary table name_tmp (
    `name` VARCHAR(10),
    `value` VARCHAR(50)
 );
 
 OPEN cur1;
 WHILE NOT done DO
 FETCH cur1 INTO n,vv;
 set @coll = CONCAT('Select Field_',n,' from app_entity_26 where id = ',i,' into @outvar');
 set v = (Select @coll from app_entity_26 where id = i );
 
 PREPARE stmt1 FROM @coll;
 EXECUTE stmt1;
 DEALLOCATE PREPARE stmt1;
 
 INSERT into name_tmp (`name`,`value`) VALUES (vv,@outvar);
 END WHILE;
 
 CLOSE cur1;
 
 
 Select * from name_tmp where `value` <> '';
END
Делаете хранимку, и вперед

v там вроде уже не нужна

Вектор я задал, можно допилить
Спасибо за подсказку. Честно сказать я вообще раньше не работал с mySQL. Постараюсь разобраться в Вашем коде, но в данный момент это темный лес.)
remchik
Сообщения: 254
Зарегистрирован: 19 сен 2019, 11:32
Имя: Remchik
Откуда: Москва

Re: Как получить все поля связанной сущности

Сообщение remchik »

Там не очень сложно, главное знать возможности, и мое личное убеждение, что БД навмного быстрее обрабатывает такие вещи, а так можно поделить на пункты:
1. объявляем переменки

Код: Выделить всё

   		DECLARE n VARCHAR(200);
    		DECLARE v VARCHAR(200);
		DECLARE vv VARCHAR(200);
		DECLARE i INT DEFAULT 2170;
		DECLARE done INT DEFAULT 0;
2. Читаем в выборку названия полей и их id, и что бы перебрать все выборку, объявляем курсор

Код: Выделить всё

DECLARE cur1 CURSOR FOR select id as idd,`name` as namem from app_fields where `name` <>''and entities_id = 26;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
2рая строка для обозначает переменку done=1 пока есть данные

3.Создаем временную таблицу

Код: Выделить всё

drop table if exists name_tmp;
 create temporary table name_tmp (
    `name` VARCHAR(10),
    `value` VARCHAR(50)
 );
4.Работаем с курсором, и пробегаем по всей выборке

Код: Выделить всё

 OPEN cur1;
 WHILE NOT done DO
 FETCH cur1 INTO n,vv;
 set @coll = CONCAT('Select Field_',n,' from app_entity_26 where id = ',i,' into @outvar');
 set v = (Select @coll from app_entity_26 where id = i );
 
 PREPARE stmt1 FROM @coll;
 EXECUTE stmt1;
 DEALLOCATE PREPARE stmt1;
 
 INSERT into name_tmp (`name`,`value`) VALUES (vv,@outvar);
 END WHILE;
 
 CLOSE cur1;
5. Ну и собственно выводим результат из временной таблицы

Код: Выделить всё

Select * from name_tmp where `value` <> '';
Вам спасибо, интересно было вспомнить, там есть еще способы разные, по сути это тоже самое что в php, Сделать запрос, пробежать по выборке, и отдельно запросами в бд выдернуть значения.
Мне чем хранимки нравятся, что их можно написать 1 раз, и использовать везде в любой точке, ну и + таскать с собой в разные проекты, думаю что и в типе поля SQL запрос - использовать удобнее, нежели php код.
***
Тружусь как пчелка
***
SQL,BpmOnline,Creatio,BpmSoft,.NET,SAP WMS,MS SQL Server,Windows Server,IIS
remchik
Сообщения: 254
Зарегистрирован: 19 сен 2019, 11:32
Имя: Remchik
Откуда: Москва

Re: Как получить все поля связанной сущности

Сообщение remchik »

ent - сюда ID Сущности
fie - сюда ID записи по которой поля доставать

Юзайте

Код: Выделить всё

PROCEDURE `get_namevalue`(ent int,fie int)
BEGIN
    DECLARE n VARCHAR(200);
--     DECLARE v VARCHAR(200);
		DECLARE vv VARCHAR(200);
-- 		DECLARE i INT DEFAULT 2170;
		DECLARE done INT DEFAULT 0;
		DECLARE cur1 CURSOR FOR select id as idd,`name` as namem from app_fields where `name` <>''and entities_id = ent;
		DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
drop table if exists name_tmp;
 create temporary table name_tmp (
    `name` VARCHAR(10),
    `value` VARCHAR(50)
 );
 OPEN cur1;
 WHILE NOT done DO
 FETCH cur1 INTO n,vv;
 set @coll = CONCAT('Select Field_',n,' from app_entity_26 where id = ',fie,' into @outvar');--
 -- set v = (Select @coll from app_entity_26 where id = i );
 PREPARE stmt1 FROM @coll;
 EXECUTE stmt1;
 DEALLOCATE PREPARE stmt1;
 INSERT into name_tmp (`name`,`value`) VALUES (vv,@outvar);
 END WHILE;
 CLOSE cur1;
 Select * from name_tmp where `value` <> '';
END
***
Тружусь как пчелка
***
SQL,BpmOnline,Creatio,BpmSoft,.NET,SAP WMS,MS SQL Server,Windows Server,IIS
Аватара пользователя
SalahievFR
Сообщения: 277
Зарегистрирован: 22 янв 2023, 10:14
Имя: Фанис Салахиев
Откуда: Россия Казань
Контактная информация:

Re: Как получить все поля связанной сущности

Сообщение SalahievFR »

remchik писал(а): 21 мар 2024, 17:42 Там не очень сложно, главное знать возможности, и мое личное убеждение, что БД навмного быстрее обрабатывает такие вещи, а так можно поделить на пункты:
1. объявляем переменки

Код: Выделить всё

   		DECLARE n VARCHAR(200);
    		DECLARE v VARCHAR(200);
		DECLARE vv VARCHAR(200);
		DECLARE i INT DEFAULT 2170;
		DECLARE done INT DEFAULT 0;
2. Читаем в выборку названия полей и их id, и что бы перебрать все выборку, объявляем курсор

Код: Выделить всё

DECLARE cur1 CURSOR FOR select id as idd,`name` as namem from app_fields where `name` <>''and entities_id = 26;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
2рая строка для обозначает переменку done=1 пока есть данные

3.Создаем временную таблицу

Код: Выделить всё

drop table if exists name_tmp;
 create temporary table name_tmp (
    `name` VARCHAR(10),
    `value` VARCHAR(50)
 );
4.Работаем с курсором, и пробегаем по всей выборке

Код: Выделить всё

 OPEN cur1;
 WHILE NOT done DO
 FETCH cur1 INTO n,vv;
 set @coll = CONCAT('Select Field_',n,' from app_entity_26 where id = ',i,' into @outvar');
 set v = (Select @coll from app_entity_26 where id = i );
 
 PREPARE stmt1 FROM @coll;
 EXECUTE stmt1;
 DEALLOCATE PREPARE stmt1;
 
 INSERT into name_tmp (`name`,`value`) VALUES (vv,@outvar);
 END WHILE;
 
 CLOSE cur1;
5. Ну и собственно выводим результат из временной таблицы

Код: Выделить всё

Select * from name_tmp where `value` <> '';
Вам спасибо, интересно было вспомнить, там есть еще способы разные, по сути это тоже самое что в php, Сделать запрос, пробежать по выборке, и отдельно запросами в бд выдернуть значения.
Мне чем хранимки нравятся, что их можно написать 1 раз, и использовать везде в любой точке, ну и + таскать с собой в разные проекты, думаю что и в типе поля SQL запрос - использовать удобнее, нежели php код.
Мне удалось в php собрать значения. Но пока не удалось объединить значения в строку и перенести эту строку в поле выше (Тип: текст с редактором)
Мой код сейчас такой:

Код: Выделить всё

$name_id = '';
$name = '';

$tovar_id = [348];

//Запрос заголовко и их id В форме сущности Товары, таб Атрибуты
$name_id_query = db_query('select * from app_fields where entities_id=27 and forms_tabs_id=38');
foreach ($name_id_query as $key => $values) {
  $name = $values['name'];
  $name_id = 'field_' . $values['id'];
    
  $item_query = db_query('select * from app_entity_27 where id=' .$tovar_id);
foreach ($item_query as $key => $value) {
  $result = $value[$name_id];
  
  if ($result != Null) {
  echo '<b style="color:red">'.$name.'</b><br>';
  echo '<b style="color:black">'.$result.'</b><br>';
   }
 }
 }

Вложения
Безымянный.png
remchik
Сообщения: 254
Зарегистрирован: 19 сен 2019, 11:32
Имя: Remchik
Откуда: Москва

Re: Как получить все поля связанной сущности

Сообщение remchik »

ну в моем варианте доработать селект

Код: Выделить всё

Select * from name_tmp where `value` <> '';
на

Код: Выделить всё

 Select GROUP_CONCAT(CONCAT(`name`,' - '),`value` SEPARATOR ';') from name_tmp where `value` <> '';
***
Тружусь как пчелка
***
SQL,BpmOnline,Creatio,BpmSoft,.NET,SAP WMS,MS SQL Server,Windows Server,IIS
Аватара пользователя
SalahievFR
Сообщения: 277
Зарегистрирован: 22 янв 2023, 10:14
Имя: Фанис Салахиев
Откуда: Россия Казань
Контактная информация:

Re: Как получить все поля связанной сущности

Сообщение SalahievFR »

Добился такого результата:

Код: Выделить всё

$name_id = '';
$name = '';

$tovar_id = [348];

//Запрос заголовко и их id В форме сущности Товары, таб Атрибуты
$name_id_query = db_query('select * from app_fields where entities_id=27 and forms_tabs_id=38');
foreach ($name_id_query as $key => $values) {
  $name = $values['name'];
  $name_id = 'field_' . $values['id'];
    
  $item_query = db_query('select * from app_entity_27 where id=' .$tovar_id);
foreach ($item_query as $key => $value) {
  $result = $value[$name_id];
  
  if ($result != Null) {
  echo '<p style="color:black">'.$name.': '.$result.'</p>';
   }
 }
 }

Вложения
Безымянный.jpg
Аватара пользователя
SalahievFR
Сообщения: 277
Зарегистрирован: 22 янв 2023, 10:14
Имя: Фанис Салахиев
Откуда: Россия Казань
Контактная информация:

Re: Как получить все поля связанной сущности

Сообщение SalahievFR »

remchik писал(а): 21 мар 2024, 10:39 Реально прикольная задача
Код не оптимизировал

Код: Выделить всё

BEGIN


    DECLARE n VARCHAR(200);
    DECLARE v VARCHAR(200);
		DECLARE vv VARCHAR(200);
		DECLARE i INT DEFAULT 2170;
		DECLARE done INT DEFAULT 0;

		DECLARE cur1 CURSOR FOR select id as idd,`name` as namem from app_fields where `name` <>''and entities_id = 26;
		DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
drop table if exists name_tmp;
 create temporary table name_tmp (
    `name` VARCHAR(10),
    `value` VARCHAR(50)
 );
 
 OPEN cur1;
 WHILE NOT done DO
 FETCH cur1 INTO n,vv;
 set @coll = CONCAT('Select Field_',n,' from app_entity_26 where id = ',i,' into @outvar');
 set v = (Select @coll from app_entity_26 where id = i );
 
 PREPARE stmt1 FROM @coll;
 EXECUTE stmt1;
 DEALLOCATE PREPARE stmt1;
 
 INSERT into name_tmp (`name`,`value`) VALUES (vv,@outvar);
 END WHILE;
 
 CLOSE cur1;
 
 
 Select * from name_tmp where `value` <> '';
END
Делаете хранимку, и вперед

v там вроде уже не нужна

Вектор я задал, можно допилить
Вы меня простите за глупые вопросы) Как Ваш код использовать в поле Ajax запрос ?
remchik
Сообщения: 254
Зарегистрирован: 19 сен 2019, 11:32
Имя: Remchik
Откуда: Москва

Re: Как получить все поля связанной сущности

Сообщение remchik »

Это хранимая процедура в БД
Добавляете хранимку, и потом вместо select вызываете ее call get_namevalue (26,2170)
***
Тружусь как пчелка
***
SQL,BpmOnline,Creatio,BpmSoft,.NET,SAP WMS,MS SQL Server,Windows Server,IIS
Аватара пользователя
SalahievFR
Сообщения: 277
Зарегистрирован: 22 янв 2023, 10:14
Имя: Фанис Салахиев
Откуда: Россия Казань
Контактная информация:

Re: Как получить все поля связанной сущности

Сообщение SalahievFR »

remchik писал(а): 21 мар 2024, 18:41 Это хранимая процедура в БД
Добавляете хранимку, и потом вместо select вызываете ее call get_namevalue (26,2170)
Спасибо, это за гранью моих знаний.)
remchik
Сообщения: 254
Зарегистрирован: 19 сен 2019, 11:32
Имя: Remchik
Откуда: Москва

Re: Как получить все поля связанной сущности

Сообщение remchik »

SalahievFR писал(а): 21 мар 2024, 18:49
remchik писал(а): 21 мар 2024, 18:41 Это хранимая процедура в БД
Добавляете хранимку, и потом вместо select вызываете ее call get_namevalue (26,2170)
Спасибо, это за гранью моих знаний.)
никогда не поздно :)
***
Тружусь как пчелка
***
SQL,BpmOnline,Creatio,BpmSoft,.NET,SAP WMS,MS SQL Server,Windows Server,IIS
Ответить