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)可能适合您的解决方案。

LIMIT经过更多的思考和评论,考虑到您需要的排序,使用 MySQL 通过/处理分页似乎OFFSET不是一件容易的事。也就是说,分页应该在 PHP 中单独处理——这里需要注意的是,您必须在每次页面加载期间加载所有 MySQL 结果。

这个想法是构建一个二维数组,其中每个“站点”作为索引,每个子数组作为每个站点的“产品”列表。构建完成后,找到最长的产品列表的长度 - 这个数字将让我们知道我们需要迭代多高才能使用这种“桶”方法。

现在,从0to迭代,the length of the longest list of products并在嵌套循环中迭代每个站点。如果该站点没有当前索引的产品,请跳过它;否则:

  • 如果当前$offest大于 0,则跳过当前乘积并减$offset1。
  • 如果$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 回答