группирование / форматирование `group` с помощью` tags` с помощью mysql или php - PullRequest
3 голосов
/ 03 июня 2011

допустим, у нас есть такой массив

из функции mysql, такой как

function getGroups($limit = 10) {
    $data = $this->fetchAll ( 'SELECT gid, `group`, information, tag FROM groups 
    GROUP BY tag LIMIT ' . $limit );
    return $data;
}

Результирующий

array
  0 => 
    array
      'gid' => string '6' (length=1)
      'group' => string 'Media' (length=5)
      'tag' => string 'advertising' (length=11)
  1 => 
    array
      'gid' => string '8' (length=1)
      'group' => string 'Fashion' (length=10)
      'tag' => string 'shorts' (length=7)
  2 => 
    array
      'gid' => string '7' (length=1)
      'group' => string 'Automotive' (length=8)
      'tag' => string 'cars' (length=5)
  3 => 
    array
      'gid' => string '1' (length=1)
      'group' => string 'Fashion' (length=7)
      'tag' => string 'tshirt' (length=6)

Мне нужно как-то отобразить это (что-то вроде)

array
   0 =>
     array
       'group' => string 'Media'
       'tags' 
          array 
          0 => string 'advertising'

   1 =>
     array
       'group' => string 'Fashion'
       'tags'
          array 
          0 => string 'short'
          1 => string 'tshirt'   
   2 =>
     array
       'group' => string 'Automotive'
       'tags'
          array
          0 => 'cars'  

1012 * простой *

group      tag
media      advertising
fashion    short
fashion    tshirt
automotive cars

до

media
  advertising
fashion
  short
  tshirt
automotive
  cars

каков наилучший способ сделать это? из массива php? или из mysql?

Ответы [ 3 ]

1 голос
/ 03 июня 2011

Я бы добавил

ORDER BY группа, тег

поэтому в результирующем наборе все строки одной и той же группы объединены.

Запуск новой может быть выполнен в php путем сравнения с предыдущей группой и закрытия / запуска новой группы, когда она изменилась.

на самом деле использование хешей имеет больше смысла ...

$names = array();
$query = ''SELECT gid, `group`, information, tag FROM groups GROUP BY tag LIMIT ' . $limit'; 
$result = mysql_query($query);
$num_rows = mysql_num_rows($result);
if ($num_rows) {
    while ($row = mysql_fetch_array($result)) {
        array_push($names[$row['group']], $row['tag']);
    }
}
1 голос
/ 03 июня 2011

Вы пытаетесь получить список групп, а также все теги для каждой группы?GROUP_CONCAT() - правильный способ получить список тегов, но вы хотите группировать по group, а не по tag:

function getGroups($limit = 10) {
    $data = (array) $this->fetchAll (
        'SELECT `group`,
        GROUP_CONCAT(DISTINCT `tag` ORDER BY `tag`) AS `tags`
        FROM `groups`
        GROUP BY `group` LIMIT ' . $limit
    );
    foreach ($data as $i => $row) {
        $data[$i]['tags'] = explode(',', $row['tags']);
    }
    return $data;
}
1 голос
/ 03 июня 2011

Попробуйте это

function getGroups($limit = 10) {
    $data = $this->fetchAll ( 'SELECT gid, `group`, information, tag FROM groups 
    GROUP BY group LIMIT ' . $limit );
    return $data;
}

Это сгруппирует ваши данные с группой, или вы можете использовать group_concat, но тогда вы получите short, tshirt что-то вроде этого.

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