2011-03-11 2 views
0

je les tableaux ci-dessous avec ces attributs:MySQL many to many Groupement

emplacement - location_id, nom

calendrier - schedule_id, nom

locatoin_schedule - location_id, schedule_id

J'utilise une requête comme celle-ci.

SELECT l.name as locationName, s.name as scheduleName 
FROM location AS l, schedule AS s, location_schedule AS ls 
WHERE ls.schedule_id = s.schedule_id 
AND ls.location_id = l.location_id 

C'est retourne un tableau qui ressemble à ceci:

Array 
(
    [0] => stdClass Object 
     (
      [locationName] => testing 
      [scheduleName] => New Schedule 
     ) 

    [1] => stdClass Object 
     (
      [locationName] => another 
      [scheduleName] => New Schedule 
     ) 

    [2] => stdClass Object 
     (
      [locationName] => testing 
      [scheduleName] => Another Schedule 
     ) 

) 

Est-il possible d'avoir ce retour un tableau multidimensionnel des horaires si un lieu a de nombreux programmes comme cela est le cas avec l'emplacement testing ? Donc mon résultat attendu sera un tableau avec seulement 2 index, plutôt que 3 ... mais le testing locationName contiendra un tableau avec deux plannings. J'espère que cela a du sens, merci pour votre réponse.

+0

Cela dépend de la façon dont les résultats de la requête sont tirés en PHP. MySQL ne retourne directement rien dans un tableau php - il renvoie un résultat de grille de colonnes et de lignes, et votre code PHP le place dans le tableau que vous avez illustré. Publiez ce code. (ie mysql_fetch_object(), etc) – David

+0

http://codeigniter.com/user_guide/database/examples.html - J'utilise codeigniter et le code est $ query = $ this-> db-> query ('SELECT nom, titre , email FROM my_table '); donc il retourne juste les lignes retournées depuis mysql et les convertit en un tableau – Mike

Répondre

4

Vous êtes bloqué soit en traitant la requête en cours dans la structure de données souhaitée, soit en utilisant GROUP_CONCAT, puis en divisant la chaîne de plannings dans la structure souhaitée. Je m'en tiens au premier parce que c'est plus propre et la requête est plus rapide.

$q=" 
SELECT l.name as locationName, s.name as scheduleName 
FROM location AS l JOIN schedule AS s ON ls.schedule_id = s.schedule_id 
JOIN location_schedule AS ls 
    ON ls.location_id = l.location_id"; 
$r=$db->query($q) 
while($arr=$r->fetch_assoc()){ 
    $data[$arr['locationName']][]=$arr['scheduleName']; 
} 

ou l'option GROUP_CONCAT:

$q=" 
SELECT l.name as locationName, GROUP_CONCAT(s.name) as scheduleName 
FROM location AS l JOIN schedule AS s ON ls.schedule_id = s.schedule_id 
JOIN location_schedule AS ls 
    ON ls.location_id = l.location_id 
GROUP BY locationName"; 
$r=$db->query($q) 
while($arr=$r->fetch_assoc()){ 
    $schedules=explode($arr['scheduleName']); 
    $data[$arr['locationName']]=$schedules 
}