1

MySQLソリューションを試しましたが、実用的ではないようで、クエリに時間がかかります。

私はこの問題に対するPHPソリューションを探しています:

テーブルの行の中に、4つの異なるサイトからの製品データがあります。

いくつかの条件を使用してクエリを実行すると、結果変数が取得されます。

$result = mysql_query("my query");

今、私は次のようにデータを取得します:

while($slice = mysql_fetch_assoc($result)){
   $product_data = $slice['productdata'];
   $site     = $slice['site']; 
}

問題は、$site変数を交互に使用して製品データを表示したいということです。

1. product from site 1;

2. product from site 2;

3. product from site 3;

4. product from site 4;

サイト2のすべての製品がリストされている場合は、次のような他の残りの製品をリストします。

1. product from site 1;

2. priduct from site 3;

3. product from site 4;

等々。

重要:ソリューションがページ付けを壊さないように、結果をページ付けしています。したがって、ページ分割できる合計行数が必要です。

PHPソリューションはありますか?

アップデート:

$result = mysql_query("SELECT site, product FROM ".$table." WHERE my mysql conditions LIMIT ".$offset.", ".$rowsperpage."");

$rowsperpage = 20;

サイト3に他の行よりもはるかに多くの行がある場合、コードを使用すると次のように生成されます。

ページ1:

  • サイト1の製品。
  • サイト2の製品。
  • サイト3の製品。
  • サイト1の製品。
  • サイト2の製品。
  • サイト3の製品。
  • サイト3の製品。
  • サイト3の製品。
  • ....。
  • 20まで

2ページ:

  • サイト1の製品。
  • サイト2の製品。
  • サイト3の製品。
  • サイト1の製品。
  • サイト2の製品。
  • サイト3の製品。
  • サイト3の製品。
  • サイト3の製品。
  • ....。
  • 20まで

ページ3は、残りのサイトを3行表示します。

  • サイト3の製品。
  • サイト3の製品。
  • サイト3の製品。
  • ....。
  • 20まで

問題は、ページ1とページ2に他の製品よりも多くのサイト3製品が表示されることです。

これは、行がランダムに混合および順序付けされているmysqlクエリが原因です。そして、そのうちの20を呼び出すと、サイトの行数は同じになりません。

私は次のようなことを達成したい:

ページ1:

  • サイト1の製品。
  • サイト2の製品。
  • サイト3の製品。
  • サイト1の製品。
  • サイト2の製品。
  • サイト3の製品。
  • サイト1の製品。
  • サイト2の製品。
  • サイト3の製品。
  • ....。
  • 20まで

2ページ:

  • サイト1の製品。
  • サイト2の製品。
  • サイト3の製品。
  • サイト3の製品。
  • サイト2の製品。
  • サイト3の製品。
  • サイト3の製品。
  • サイト3の製品。

.....20まで

私が達成したいことは、オフセットと制限なしでページ化された各ページにクエリがある場合にのみコードで機能します

4

1 に答える 1

1

これがあなたのために働くかもしれない解決策で(試み#2)です。

さらに考えてコメントした後、MySQLを使用してLIMIT/OFFSETを介してページ付けを処理することは、必要な順序を考慮すると簡単な作業ではないようです。とは言うものの、ページネーションはPHPで適切に処理する必要があります。ここでの注意点は、ページをロードするたびにすべてのMySQL結果をロードする必要があるということです。

アイデアは、各「サイト」をインデックスとして、各サブアレイを各サイトの「製品」のリストとして使用する2Dアレイを構築することです。これが構築された後、製品の最も長いリストの長さを見つけます-その数は、この「バケット」メソッドを使用するために繰り返す必要がある高さを知らせてくれます。

ここで、から0を繰り返しthe length of the longest list of products、ネストされたループで各サイトを繰り返します。サイトに現在のインデックスの製品がない場合は、スキップしてください。そうでなければ:

  • 電流$offestが0より大きい場合は、現在の積をスキップ$offsetして1ずつデクリメントします。
  • $offsetが0以下の場合、積を出力します。

サンプルコード:

// define what page we're on (will probably come from $_GET)
$page = 1;

// define how many products to display per-page
$productsPerPage = 20;

// calculate the current offset based on the page-# and the #-per-page
$offset = (($page - 1) * $productsPerPage);

// get the full results from the database
$results = mysql_query("your query");
if (mysql_num_rows($results) <= $offset) {
    // the current page is too high; you could set it to the last page,
    // or loop back to page #1, display an error, etc.
    return;
}

$sites = array();
while ($row = mysql_fetch_assoc($result)) {
    if (!isset($sites[$row['site']])) {
        // initialize the products-array for this site
        $sites[$row['site']] = array();
    }
    // add this product to the array for this site
    $sites[$row['site']][] = $row['productdata'];
}

// get the largest-number of products for a given site
$maxProducts = 0;
foreach ($sites as $products) {
    if ($maxProducts == 0) {
        // set the first list of products as the "most"
        $maxProducts = count($products);
    } else if (($count = count($products)) > $maxProducts) {
        // the current list of products is larger than what we've found
        $maxProducts = $count;
    }
}

// iterate from the $siteOffset to the highest-number of products
for ($i = 0; $i < $maxProducts; $i++) {
    // iterate through each site and check if it has a product at this "level"
    foreach ($sites as $site => $products) {
        if (isset($products[$i])) {
            // there is a product for this site on this "level";
            // if we haven't reached our offset yet, skip it
            if ($offset-- > 0) continue;
            // otherwise, output it!
            echo $products[$i] . ' from site ' . $site . '<br />';
        }
    }
}
于 2012-08-15T15:03:30.590 に答える