PHP - Получение ограниченных фрагментов большого массива из таблицы MySQL - PullRequest
1 голос
/ 19 ноября 2009

Допустим, у вас есть такой стол:

ID  Cat1  Cat2
1    a     red
2    b     red
3    c     blue
4    d     blue
5    e     blue
6    f     green
etc  etc   etc

Цель состоит в том, чтобы отобразить ID и Cat1 (уникальные пары), разделенные на группы в соответствии с Cat2. Самый простой выход состоит в том, чтобы запустить отдельный запрос MySQL для каждого Cat2, но с большим количеством различных значений Cat2, которые производят на порядок больше запросов для отображения одной страницы для зрителя, чем просто сбор всей партии данных в одном запросе и разрезать его на части с помощью PHP.

Я закончил форматирование. Но мне трудно понять, как ограничить вывод моей строки на основе значения третьего столбца в массиве $value[2], взятого из $value = mysql_fetch_row($result) после использования
$sql = "SELECT ID,Cat1,Cat2 FROM MyTable ORDER BY Cat2,ID"

На простом английском (явно НЕ настоящий код) это будет выглядеть так:

$result = mysql_query($sql);

IF ($value[2] from $value = mysql_fetch_row($result) = "red")
    {
        echo "Red Group";
        WHILE ()
    {
        echo $value[0] and $value[1] for all the rows where Cat2 = red
    }
    }

IF ($value[2] from $value = mysql_fetch_row($result) = "blue")
    {
        echo "Blue Group";
        WHILE ()
     {
        echo $value[0] and $value[1] for all the rows where Cat2 = blue
     }
    }
etc

Имеет ли все это смысл? Как вы извлекаете эти группы данных из массива $result?

Очевидно, это не все имеет смысл! : -) Вот пример желаемого результата:

RED GROUP
1  a
2  b

BLUE GROUP
3  c
4  d
5  e

GREEN GROUP
6  f

etc

Спасибо!

Ответы [ 3 ]

3 голосов
/ 19 ноября 2009

Не знаю, правильно ли я вас понимаю, но решит ли это вашу проблему?

Основная идея заключается в том, что вы перебираете все строки и всегда сохраняете последнее значение Cat2. Всякий раз, когда вы обнаруживаете, что Cat2 изменяется, вы можете вставить «заголовок» для нового Cat2. Поскольку вы сначала сортируете результаты в соответствии с Cat2, вы получите желаемый результат.

$query = "SELECT ID,Cat1,Cat2 FROM MyTable ORDER BY Cat2,ID"
$result = mysql_query($query);
$last = "";
while ($line = mysql_fetch_row($result)) {
  if ($line[2] != $last) {
    echo $line[2] . ' Group';
    $last = $line[2];
  }
  echo $line[0] . ' ' . $line[1];
}
0 голосов
/ 19 ноября 2009

Я скажу, вероятно, сделал бы это

$result = array();
foreach($data as $row){
 if(isset($result[$row['Cat2']])){
   $result[$row['Cat2']][] = $row;
 } else {
   $result[$row['Cat2']] = array( $row );
 }
}

это даст массив, сгруппированный по Cat2 после того, как он просто дважды зациклится на этом массиве, чтобы получить желаемый результат.

0 голосов
/ 19 ноября 2009

То, что вы хотите сделать, - это просто ограничить число строк, которые ваша база данных будет возвращать, используя оператор SQL WHERE. Гораздо проще:

$sql = "SELECT ID,Cat1,Cat2 FROM MyTable ORDER BY Cat2,ID";
$result = mysql_query($sql, $link) or die('Error');

$last_group = '';

echo '<table>';

while (list($id, $cat1, $cat2) = mysql_fetch_row($result))
{
    if ($cat2 != $last_group)
    {
        echo '<tr><td colspan="2">'.$cat2.' group</td></tr>';
    }

    echo '<tr><td>'.$id.'</td><td>'.$cat1.'</td></tr>';

    $last_group = $cat2;
}

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