ищет эффективный способ группировки данных на выходе в PHP - PullRequest
1 голос
/ 27 января 2010

У меня есть таблица, в которой хранятся товары, другая - с вариациями, а третья - с разными (у многих продуктов может быть много вариаций.) Я хочу отобразить (сгруппировать) каждый продукт и показать варианты.

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

Ответы [ 4 ]

0 голосов
/ 28 января 2010

Я думаю вы ищете способ составить список одного продукта и всех его вариантов. Или составьте список всех продуктов, а затем для каждого продукта, чтобы показать все варианты этого продукта.

Я предполагаю, что ваши таблицы выглядят примерно так:

product
    productId
    description

variation
    variationId
    description

productVariation
    productVariationId
    productId
    variationId

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

SELECT
    P.description as product,
    V.description as variation
FROM
    product as P,
INNER JOIN
    productVariation AS PV
    ON PV.productId = P.productId
INNER JOIN
    variation as V
    ON V.variationId = PV.variationId
WHERE
    P.productId = 1

Для всего списка продуктов просто опустите предложение WHERE. Если товар не имеет вариантов, он не будет включен в список. Если вы хотите этого, используйте вместо этого ЛЕВЫЕ СОЕДИНЕНИЯ.

Запрос вернет следующее

product variation
shoe    blue
shoe    green
shoe    red
hat     green
hat     purple
hat     yellow
sock    white

Обновление:

Полагаю, вы хотите, чтобы данные отображались следующим образом:

shoe
blue
green
red

hat
green
purple
yellow

sock
white

Это можно сделать с помощью следующего кода PHP.

$sql = "
    SELECT
        P.productId,
        P.description as product,
        V.description as variation
    FROM
        product as P,
    INNER JOIN
        productVariation AS PV
        ON PV.productId = P.productId
    INNER JOIN
        variation as V
        ON V.variationId = PV.variationId    
";

$result = mysql_query($sql);

//first put all the results into an array so we can look backward and 
//see previous items
$resultSet = array();
while($record = mysql_fetch_array($result)) {
    $resultSet[] = $record;
}

for ( $i = 0 ; $i < count($resultSet) ; $i++ ) {
    if ( $i == 0 ) {
        //for the first item, show the product name
        echo $resultSet[$i]['product'].'<br/>';
    } else if ($resultSet[$i]['productId'] != $resultSet[$i-1]['productId']) {
        //every time we encounter a new product
        //display a new line and show the product name
        echo '<br/>'.$resultSet[$i]['product'].'<br/>';
    }
    echo $resultSet[$i]['variation'].'<br/>';
}
0 голосов
/ 27 января 2010

Я бы предложил изменить ваш SQL, чтобы он отображал нужные вам данные, поэтому вам не нужно изменять данные вручную. group by claus , или order by clause может быть вашим другом здесь.

0 голосов
/ 27 января 2010

Я бы предпочел использовать кеширующий Sytem.

No cache

alt text

Реализация кэша в PHP

<?php
// start the output buffer
ob_start(); ?>

//Your usual PHP script and HTML here ...

<?php
$cachefile = "cache/home.html";
// open the cache file "cache/home.html" for writing
$fp = fopen($cachefile, 'w');
// save the contents of output buffer to the file
fwrite($fp, ob_get_contents());
// close the file
fclose($fp);
// Send the output to the browser
ob_end_flush();
?>

Использование кэшированных файлов

<?php

$cachefile = "cache/home.html";

if (file_exists($cachefile)) {


    // the page has been cached from an earlier request

    // output the contents of the cache file

    include($cachefile); 


    // exit the script, so that the rest isnt executed
    exit;

}

?>
0 голосов
/ 27 января 2010

Если вы пишете SQL, ваш выбор - это либо один запрос, в котором вы выполняете сравнения, либо множество запросов, которые зависят от первого. С другой стороны, ADOdb для PHP имеет ActiveRecords, который может обрабатывать отношения один-ко-многим для вас. http://phplens.com/lens/adodb/docs-active-record.htm#onetomany

...