xandeadx.ru Блог музицирующего веб-девелопера

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

Опубликовано в

Пример использование подзапроса в 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
Похожие записи

Комментарии RSS

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

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

Пост старый, но по запросу в 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();

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании