2011-09-21 5 views
0

J'ai une requête MySQL qui sélectionne les noms d'utilisateur et leurs connaissances (peut-être plus d'un).Comment regrouper les résultats dans la requête?

Il retourne quelque chose comme ça ...

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" 
    } 
} 

Comme vous pouvez le voir, dans cet exemple, il ne les rendements cinq entrées. Cependant, trois d'entre eux ont des ID (et des noms) en double. Je cherche un moyen de retourner seulement trois entrées comme ceci ...

Est-il possible de faire dans la requête?

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" 
    } 
    } 
} 

L'autre option que je vois est de traiter les résultats côté serveur.

Voici comment la requête ressemble à:

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`) 

Répondre

1

Pour ce cas particulier, vous pouvez écrire quelque chose comme ceci:

$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']; 
} 

Cependant, il est une meilleure idée d'utiliser un ORM tel que Doctrine à gérer de telles situations.

+0

Merci, c'est ce que je pensais. [This] (http://pastie.org/2567903) est ce que j'ai trouvé ... comment y parvenir avec ORM? :) – daGrevis

Questions connexes