Получение уникальных значений 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);
Надо получить уникальные значения 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);
Комментарии: 6
Вот, набросал код под твой случай, только тебе нужно будет изменить «Предустановки» под свои конкретные:
<?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 без подтягивания тяжелых объектов.
Огромнейшее спасибо!
Вот без подзапроса — с использованием 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>";
}
}
Добрый день.
А как нужно модифицировать код, что бы получить в результате несколько TV параметров?
Спасибо…
А как нужно модифицировать код, что бы получить в результате несколько TV параметров?
Спасибо…
И да, код пишется в теге code (для этого есть специальная кнопочка), а то глаза себе сломал пока читал.
И да, привет Рыбнице от СИ Молдовы ))
И да, привет Рыбнице от СИ Молдовы ))
Привет уже передал! ))
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.