Получение уникальных значений tv у выбранных ресур

Перелопатил интернет и ничего путного не получил… либо не туда глядел (
Надо получить уникальные значения tv «urov2», но только тех ресурсов,
у которых tv «urov1» = «Щиты (шкафы) контрольно-пусковые».
То что видел в нете очень ресурсо-затратно т.к товаров несколько тыс…
Вот что то набросал что бы получить id ресурсов… Как бы это совместить с leftJoin?

$q = $modx->newQuery('modTemplateVarResource');
$q->select(
array(
'contentid'
)
);
$q->where(
array(
«modTemplateVarResource.value» => «Щиты (шкафы) контрольно-пусковые»,
)
);

$q->prepare();
$q->stmt->execute();

$result = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($result);
Виталий
08 марта 2017, 18:57
modx.pro
1
1 926
0

Комментарии: 6

Василий Столейков
09 марта 2017, 11:22
1
+1
Вот, набросал код под твой случай, только тебе нужно будет изменить «Предустановки» под свои конкретные:
<?php
// Предустановки
$urov1 = 1; // id tv urov1
$urov1_val = 'Щиты (шкафы) контрольно-пусковые';
$urov2 = 2; // id tv urov2

// Запрос в базу
$prefix = $modx->config['table_prefix'];
$q = $modx->prepare("SELECT DISTINCT value
                        FROM {$prefix}site_tmplvar_contentvalues WHERE tmplvarid = '{$urov2}' AND contentid IN (
                            SELECT contentid FROM {$prefix}site_tmplvar_contentvalues WHERE tmplvarid = '{$urov1}' AND value = '{$urov1_val}'
                        )
                        ");                                
$q->execute();
$r = $q->fetchAll(PDO::FETCH_ASSOC);

foreach($r as $row){
    print_r($row);
}
Код выполняется быстро, т.к. только один запрос в базу и написан на чистом xPDO без подтягивания тяжелых объектов.
    Виталий
    09 марта 2017, 11:40
    0
    Огромнейшее спасибо!
      Илья Уткин
      09 марта 2017, 11:43
      1
      0
      Вот без подзапроса — с использованием JOIN:
      <?php
      // Предустановки
      $urov1 = 1; // id tv urov1
      $urov1_val = 'Щиты (шкафы) контрольно-пусковые';
      $urov2 = 2; // id tv urov2
      
      $q = $modx->newQuery('modResource');
      $q->leftJoin('modTemplateVarResource', 'urov1', 'modResource.id = urov1.contentid AND urov1.tmplvarid = ' . $urov1);
      $q->leftJoin('modTemplateVarResource', 'urov2', 'modResource.id = urov2.contentid AND urov2.tmplvarid = ' . $urov2);
      $q->groupby('modResource.id');
      
      $q->select(array(
          'DISTINCT(`urov2`.`value`) AS `urov2`'
      ));
      
      $q->where(array(
          'urov1.value' => $urov1_val
      ));
      
      $count = $modx->getCount('modResource', $q);
      $resources = array();
      if ($q->prepare() && $q->stmt->execute()) {
      	$resources = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
      }
      print "<p>Всего ресурсов найдено: ".$count."</p><p>--</p>";
      if ($resources) {
          print "<p>Из них уникальных значений: ".count($resources)."</p>";
          foreach($resources as $resource) {
              print "<p><b>".$resource['urov2'] ."</b></p>";
          }
      }
        Сергей Максимов
        10 мая 2017, 18:06
        0
        Добрый день.
        А как нужно модифицировать код, что бы получить в результате несколько TV параметров?
        Спасибо…
        Василий Столейков
        09 марта 2017, 11:29
        1
        +1
        И да, код пишется в теге code (для этого есть специальная кнопочка), а то глаза себе сломал пока читал.
        И да, привет Рыбнице от СИ Молдовы ))
          Виталий
          09 марта 2017, 11:41
          0
          Привет уже передал! ))
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          6