Как сгруппировать результаты в запросе? - PullRequest
0 голосов
/ 21 сентября 2011

У меня есть запрос MySQL, который выбирает имена пользователей и их знания (может быть больше одного).

Он возвращает что-то вроде этого ...

array(5) {
  [0]=>
  array(5) {
    ["user_id"]=>
    string(2) "30"
    ["name"]=>
    string(6) "foo1"
    ["knowledge"]=>
    string(15) "Basic Materials"
  }
  [1]=>
  array(5) {
    ["user_id"]=>
    string(2) "33"
    ["name"]=>
    string(6) "foo2"
    ["knowledge"]=>
    string(15) "Basic Materials"
  }
  [2]=>
  array(5) {
    ["user_id"]=>
    string(2) "34"
    ["name"]=>
    string(10) "foo3"
    ["knowledge"]=>
    string(9) "Eating"
  }
  [3]=>
  array(5) {
    ["user_id"]=>
    string(2) "34"
    ["name"]=>
    string(10) "foo3"
    ["knowledge"]=>
    string(9) "Financial"
  }
  [4]=>
  array(5) {
    ["user_id"]=>
    string(2) "34"
    ["name"]=>
    string(10) "foo3"
    ["knowledge"]=>
    string(8) "Services"
  }
}

Как видите,в этом примере он возвращает пять записей.Тем не менее, три из них имеют повторяющиеся идентификаторы (и имена).Я ищу способ вернуть только три записи, подобные этой ...

Возможно ли сделать запрос?

array(5) {
  [0]=>
  array(5) {
    ["user_id"]=>
    string(2) "30"
    ["name"]=>
    string(6) "foo1"
    ["knowledges"]=>
    array(1) {
        [0] => string(15) "Basic Materials"
    }
  }
  [1]=>
  array(5) {
    ["user_id"]=>
    string(2) "33"
    ["name"]=>
    string(6) "foo2"
    ["knowledges"]=>
    array(1) {
        [0] => string(15) "Basic Materials"
    }
  }
  [2]=>
  array(5) {
    ["user_id"]=>
    string(2) "34"
    ["name"]=>
    string(10) "foo3"
    ["knowledges"]=>
    array(1) {
        [0] => string(15) "Eating"
        [1] => string(15) "Financial"
        [2] => string(15) "Services"
    }
  }
}

Другой вариант, который я вижу, - это обработка результатов нана стороне сервера.

Вот как выглядит запрос:

SELECT `profiles`.`user_id`, `users`.`name`, `users`.`surname`, `users`.`country`, `profile_knowledges`.`knowledge`
FROM `profiles`
JOIN `users`
ON (`users`.`id` = `profiles`.`user_id`)
JOIN `profile_knowledges`
ON (`profile_knowledges`.`profile_id` = `profiles`.`id`)

1 Ответ

1 голос
/ 21 сентября 2011

Для этого конкретного случая вы могли бы написать что-то вроде этого:

$users = array();

while ($row = /* fetch a single row from result set */) {
    if (isset($users[$row['user_id']]) == false) {
        $users[$row['user_id']] = array(
            'id' => $row['user_id'],
            'name' => $row['name'],
            'knowledges' => array()
        );
    }

    $users[$row['user_id']]['knowledges'][] = $row['knowledge'];
}

Однако лучше использовать ORM , например, Doctrine для обработки такихситуаций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...