2013-06-01 4 views
-1

У меня 3 таблицы:PHP MySQL и GROUP_CONCAT

module_names (MODULE_ID, module_name)

  • 1 | test_module
  • 2 | test_module2
  • 3 | test_module3

module_groups (group_id, group_name)

  • 1 | группа
  • 2 | group2
  • 3 | group3
  • 4 | Group4

modules_to_groups (MODULE_ID, group_id)

  • 2 | 2
  • 1 | 2
  • 3 | 4

Когда я использую GROUP_CONCAT в моем запросе я получение правильные результаты

group2 -> test_module , test_module2 
group4 -> test_module3 

Но я хочу:

group1 -> (no module added yet) 
group2 -> test_module , test_module2 
group3 -> (no module added yet) 
group4 -> test_module3 

Все функции я использую:

function ListModuleGroups() { 
global $admin,$prefix, $db, $admin_file; 
OpenTable(); 
echo '<div><b>Groups and Modules :</b></div>'; 
$result = $db->sql_query("SELECT m.module_id, m.module_name, g.group_name, g.group_id, GROUP_CONCAT(m.module_name) from " . $prefix . "_mmmodule_groups g, " . $prefix . "_mmmodule_names m, " . $prefix . "_mmmodule_to_group m2g where m.module_id = m2g.module_id and m2g.group_id = g.group_id and g.group_id = g.group_id group by g.group_id"); 
while($row = $db->sql_fetchrow($result)) { 
     $group_name = $row['group_name']; 
     $module_name = $row['GROUP_CONCAT(m.module_name)']; 

     echo "<div>".htmlentities($group_name). '--' . htmlentities($module_name)." </div>"; 
    } 
CloseTable(); 
} 

ответ

1

первым там, кажется, странное состояние, в вашем SQL - g.group_id = g.group_id , Возможно, вы можете попытаться удалить его.

Во-вторых, вы должны использовать LEFT JOIN для чтения всех групп. LEFT JOIN выбирает все записи из таблицы слева и только соответствующие записи из таблицы вправо. Пожалуйста, обратитесь к документам MySQL для дальнейшего чтения.

Ниже кода может помочь получить желаемое resutls:

function ListModuleGroups() { 
    global $admin,$prefix, $db, $admin_file; 
    OpenTable(); 
    echo '<div><b>Groups and Modules :</b></div>'; 

    $result = $db->sql_query("SELECT g.group_name, GROUP_CONCAT(m.module_name) modules 
    from " . $prefix . "_mmmodule_groups g 
     LEFT JOIN " . $prefix . "_mmmodule_to_group m2g ON g.group_id = m2g.group_id 
     LEFT JOIN " . $prefix . "_mmmodule_names m ON m2g.module_id = m.module_id 
    GROUP BY g.group_id"); 

    while($row = $db->sql_fetchrow($result)) { 
      $group_name = $row['group_name']; 
      if (!empty($row['modules'])) { 
       $module_name = $row['modules']; 
      } else { 
       $module_name = '(no module added yet)'; 
      } 
      echo "<div>".htmlentities($group_name). '--' . htmlentities($module_name)." </div>"; 
     } 
    CloseTable(); 
} 

Надеется, что это помогает!

+1

Спасибо ВАМ !! , я принял ваш ответ, потому что вы заметили слева от group_id = group_id, и вы написали полную функцию. +1. – HenryW

2

Вы должны использовать LEFT JOIN, так как вы хотите, чтобы перечислить все module_groups,

SELECT a.Group_name, 
     GROUP_CONCAT(c.Module_Name) 
FROM module_group a 
     LEFT JOIN modules_to_groups b 
      ON a.group_id = b.group_id 
     LEFT JOIN module_names c 
      ON b.module_ID = c.module_ID 
GROUP BY a.Group_name 

Для дальнейшего получить больше знаний о присоединяется, любезно перейдите по ссылке ниже:

+0

Я, конечно, должен был проголосовать за указание на SQLFiddle и показать мне рабочий пример. Также БОЛЬШОЕ Спасибо за вас.(рад узнать, что это также есть скрипка для sql) +1 для вас. – HenryW

Смежные вопросы