Как сделать сложный запрос?

Главные вкладки

Аватар пользователя Victorzzz Victorzzz 20 сентября 2017 в 18:07

Есть типы материала: "authors", "klients", "works"
Мне надо получить список всех людей по ID, Имени Фамилии, типу учетной записи, а в случае с авторами также еще и кол-ву работ
Т.е. конечная таблица должна выглядеть примерно так:

1 Иван Иванов (Клиент)
2 Петр Петров (Клиент)
4 Семен Семенов (Клиент)
5 Алексей Алексеев (Автор / 6 работ)
6 Федот Федотов (Автор / 5 работ)

* Кол-во работ указывается только для авторов (связанных в нодах "authors" через enity reference нод типа "work").

Для получения списка авторов имею такой запрос:

$query = db_select('node', 'n')->condition('n.status', 0,'>')->condition(db_or()->condition('n.type', 'authors')->condition('n.type', 'klients'));
$query->innerJoin('node_type', 'nt', 'n.type = nt.type');
$query->innerJoin('field_data_field_name_surname', 'nms', 'n.nid = nms.entity_id');
$result = $query->FIELDS('n', array('nid', 'type', 'title'))
      ->FIELDS('nt', array('name'))
      ->orderBy('n.type', 'DESC')
      ->orderBy('n.title', 'ASC')
      ->addTag('node_access')
      ->range(0, $_POST['maxItems'])
      ->EXECUTE()->fetchAll();

Но итогом такого запроса получается такой список:
1 Иван Иванов (Клиент)
2 Петр Петров (Клиент)
4 Семен Семенов (Клиент)
5 Алексей Алексеев (Автор)
6 Федот Федотов (Автор)

Как составить запрос, чтобы результат получился такой как я привел в начале вопроса, т.е. с указанным в скобках кол-вом работ авторов?

Понимаю, что нужно копать в сторону addExpression или countQuery(), но не могу понять как сформировать такой сложный запрос.

Спасибо.

Комментарии

Аватар пользователя Victorzzz Victorzzz 20 сентября 2017 в 18:21

xakd wrote:

И где вы кстати пытаетесь запросить кол-во работ, в какой фразе?


А я пока нигде не пытаюсь. Мне как раз и надо в этом запросе еще и кол-во работ запросить.

Аватар пользователя xakd xakd 20 сентября 2017 в 18:26

Victorzzz wrote:
Но итогом такого запроса получается такой список

А где код, как мы его так получаем то? Пробовали через PHP, а не через запрос mysql, получать кол-во работ?

Аватар пользователя Victorzzz Victorzzz 20 сентября 2017 в 18:30

Результат обрабатывается так:

<?phpforeach ($result as &$data) {
    $data->nid = $data->nid;
    $data->title = check_plain($data->title);
    $data->name = check_plain($data->name);
  }

  // и отправляем результат.
  drupal_json_output($result);?>

Аватар пользователя xakd xakd 20 сентября 2017 в 18:37

ну так делайте через php в цикле этом - доступ к типу есть, если тип authors - то запрашиваете количество. Как сделаете это на PHP и если свербит желание сделать это напрямую, без PHP - так разместите рабочий код, вам сразу напишут его аналог с прямым запросом MYSQL.
А так у вас в посте просто не хватает информации - как у вас крепятся эти посты к авторам.

Аватар пользователя xakd xakd 20 сентября 2017 в 18:42

а, сам $result меняем через &, ясно. Хотя конструкция сама какая то странная - надежнее из $result свой массив составить

Аватар пользователя mbaev mbaev 20 сентября 2017 в 22:30
<?php
$query 
db_select('node''n')
  ->
condition('n.status'0,'>')
  ->
condition(db_or()
    ->
condition('n.type''authors')
    ->
condition('n.type''klients')
  );
$query->innerJoin('node_type''nt''n.type = nt.type');
$query->innerJoin('field_data_field_name_surname''nms''n.nid = nms.entity_id');
$query->fields('n', array('nid''type''title'))
  ->
fields('nt', array('name'));
// Подставьте свой запрос который делает выборку количества работ.
$sub_query db_select()->fields()->orderBy()->groupBy();
$query->addExpression('count(:completed_works)''completed_works', array(
  
':completed_works' => $sub_query
));
  
$query->orderBy('n.type''DESC')
  ->
orderBy('n.title''ASC')
  ->
addTag('node_access')
  ->
range(0$_POST['maxItems']);
$result $query->execute()->fetchAll();
?>