Drupal → Подзапросы в Database API семёрки

21.07.2011

Пример использование подзапроса в SELECT:

$subquery = db_select('node', 'n');
$subquery->addExpression('COUNT(*)');
$subquery->where('n.uid = u.uid');
  
$query = db_select('users', 'u');
$query->fields('u', array('uid', 'name'));
$query->addExpression('(' . $subquery . ')', 'nodes');
$users = $query->execute();

Код выбирает пользователей и подсчитывает созданные ими ноды. Он равносилен запросу:

$users = db_query("
  SELECT u.uid, u.name, (
    SELECT COUNT(*)
    FROM {node} n
    WHERE n.uid = u.uid
  ) AS nodes
  FROM {users} u
");

Красивее решения пока не нашёл. Единственный замеченный минус — в подзапросе нельзя использовать аргументы:

$subquery->condition('поле', 'аргумент'); // fail
$subquery->addExpression('выражение', 'алиас', 'аргументы'); // fail
Написанное актуально для
Drupal 7
Похожие записи

Комментарии

Гость
21.07.2011, 12:11

разве не проще и быстрее будет джоин с группировкой? уверен что будет быстрее работать чем подзапрос

в данном контексте это не имеет значение

Пост старый, но по запросу в google в на 1ом месте, по этому допишу решение:
собственно структура запроса остается та же, но не

$subquery->addExpression('выражение', 'алиас', 'аргументы'); //fail 

а

$query->addExpression('(' . $subquery . ')', 'nodes','аргументы'); //success 

Допустим нужно посчитать ноды для юзера только типа 'page', тогда

$nodeType = 'page';
$subquery = db_select('node', 'n');
$subquery->addExpression('COUNT(*)');
$subquery->where('n.uid = u.uid');

$query = db_select('users', 'u');
$query->fields('u', array('uid', 'name'));

$subArgs = array();
if(!empty($nodeType)){
	$subquery->where('n.type = :sub_type'); // только объявляем параметр
	$subArgs[':sub_type']=$nodeType; 
}

$query->addExpression('(' . $subquery . ')', 'nodes', $subArgs);
$users = $query->execute()->fetchAll();

Добавить комментарий