Как получить список уникальных значений дополнительных полей ИС?

#
Как получить список уникальных значений дополнительных полей ИС?
Подскажите пожалуйста, у меня такая задача, нужно получить список уникальных значений доп. полей подгрупп и количество их повторений)
Модератор
#
Re: Как получить список уникальных значений дополнительных полей ИС?
yellow_limon4ik,
Написать SQL-запрос, который будет выбирать свойства заданных подгрупп и группировать их.
#
Re: Как получить список уникальных значений дополнительных полей ИС?
```if ( $Informationsystem_Controller_Show->group)
{
   // Текущая группа
   $oInformationsystem_Group = Core_Entity::factory('Informationsystem_Group', $Informationsystem_Controller_Show->group);
   if ($oInformationsystem_Group) {
      $oSubgroups = $oInformationsystem_Group->Informationsystem_Groups;
      $oSubgroups->queryBuilder()
         ->select('informationsystem_groups.*')
         ->leftJoin('property_value_strings', 'informationsystem_groups.id', '=', 'property_value_strings.entity_id',
       array(
          array('AND' => array('property_value_strings.property_id', '=', 100))
       ))
       ;

      $aSubgroups = $oSubgroups->findAll(FALSE);
      if (count($aSubgroups)) {

         foreach ($aSubgroups as $oSubgroup) {
             $oProperty = Core_Entity::factory('Property', 100);
             $aPropertyValues = $oProperty->getValues($oSubgroup);
             var_dump($aPropertyValues);
         }
      }
   }
}
Подскажите куда двигаться дальше в $oSubgroup не хранятся доп. свойста(
#
Re: Как получить список уникальных значений дополнительных полей ИС?
yellow_limon4ik,
очень накладный у вас конечно будет запрос если так значения тянуть в цикле для каждой группы (хотя если мало групп, то можно и так), легче это сделать через GROUP BY и COUNT, но тут нужны хотя бы знания mysql

Цитата:
Подскажите куда двигаться дальше в $oSubgroup не хранятся доп. свойста(

$oProperty->getValues($oSubgroup->id)

внимательнее почитать тут https://www.hostcms.ru/documentation/modules/properties/introduction/

еще $oProperty = Core_Entity::factory('Property', 100); вынесите из цикла
www.morozovpimnev.ru - создание, поддержка и продвижение сайтов | Наш канал https://asmp.su/channel
#
Re: Как получить список уникальных значений дополнительных полей ИС?
if ( $Informationsystem_Controller_Show->group)
{
   // Текущая группа
   $oInformationsystem_Group = Core_Entity::factory('Informationsystem_Group', $Informationsystem_Controller_Show->group);
   if ($oInformationsystem_Group) {
      $oSubgroups = $oInformationsystem_Group->Informationsystem_Groups;
      $oSubgroups->queryBuilder()
         ->select('informationsystem_groups.*')
         ->leftJoin('property_value_strings', 'informationsystem_groups.id', '=', 'property_value_strings.entity_id',
       array(
          array('AND' => array('property_value_strings.property_id', '=', 100))
       ))
       ;
     $aSubgroups = $oSubgroups->findAll(FALSE);
      if (count($aSubgroups)) {
    $oProperty = Core_Entity::factory('Property', 100);
    $aPropertyValuesArray = array(); // Создаем пустой массив для сохранения значений свойств

    foreach ($aSubgroups as $oSubgroup) {
          $aPropertyValues = $oProperty->getValues($oSubgroup->id);
          $aPropertyValuesArray[$oSubgroup->id] = strval($aPropertyValues[0]->value);
    }
   $uniqueValues = array_count_values($aPropertyValuesArray);
    foreach ($uniqueValues as $value => $count) {
        echo "Значение: $value, Количество повторений: $count<br>";
    }
}

Я не силен в  mysql, буду благодарен если подскажите что нужно изменить в нем)
Модератор
#
Re: Как получить список уникальных значений дополнительных полей ИС?
yellow_limon4ik,
1. зачем при выборе подгрупп вы делаете объединение со свойством, если затем ничего из результата не используете?
2. Выбираете вы просто подгруппы 1 уровня, у них еще могут быть подгруппы, вероятно выбор подгрупп должен быть рекурсивным.
3. Запись в aPropertyValuesArray и использование array_count_values спорно, ключом у вас является идентификатор группы, соответственно если несколько значений задано одной группе, то последующие перезапишут предыдущие.

Можно пойти от обратного и по таблице property_value_strings посчитать количество использований для entity_id, таким образом будут данные для ВСЕХ групп инфосистемы одним запросом, останется просто извлечь интересующие вас данные.
#
Re: Как получить список уникальных значений дополнительных полей ИС?
$oInformationsystem_Group = Core_Entity::factory('Informationsystem_Group', $Informationsystem_Controller_Show->group);
$groupId = $oInformationsystem_Group->id; // Идентификатор текущей группы

$query = Core_QueryBuilder::select('property_value_strings.value AS color, COUNT(*) AS count')
            ->from('informationsystem_groups')
            ->join('property_value_strings', 'informationsystem_groups.id', '=', 'property_value_strings.entity_id')
            ->where('informationsystem_groups.active', '=', 1)
            ->where('informationsystem_groups.parent_id', '=', $groupId)
            ->where('property_value_strings.property_id', '=', 100)
            ->groupBy('property_value_strings.value')
            ->execute()
            ->asAssoc()
            ->result();

foreach ($query as $row) {
    $color = $row['color'];
    $count = $row['count'];

    // Вывод результатов
    echo "Цвет: " . $color . ", Количество: " . $count . "<br>";
}

Переделал так, чтобы ничего лишнего не тащить и получить только дополнительное поля с property_value_strings.property_id', '=', 100 . Но остается вопрос, если мне например нужно не одно дополнительное поле а несколько, например с property_value_strings.property_id', '=', 100 и property_value_strings.property_id', '=', 101, то мне нужно для каждого писать свой sql запрос?
Модератор
#
Re: Как получить список уникальных значений дополнительных полей ИС?
yellow_limon4ik,
1. Замените
select('property_value_strings.value AS color, COUNT(*) AS count')
на
select(array('property_value_strings.value', 'color'), array('COUNT(*)', 'count'))

2. Для разных свойств проще выполнить повторно запрос с нужным идентификатором. Выборку можно оформить в виде функции.
#
Re: Как получить список уникальных значений дополнительных полей ИС?
Цитата:
если мне например нужно не одно дополнительное поле а несколько, например с property_value_strings.property_id', '=', 100 и property_value_strings.property_id', '=', 101

Попробуйте условие заменить на:
->where('property_value_strings.property_id', 'IN', array(100,101))
E-mail: info@syrbek.ru / телега: @syrbek /skype: activexm / syrbek.ru / Поддержка сайтов / г. Москва [HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, Git, SVN, Redmine]
Авторизация