PHP解决方案来替换变量查询的结果(1,2,3,4 - 1,2,3,4)

时间:2012-08-15 14:24:46

标签: php

我尝试过一个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

我想要实现的只有在每个分页页面上都有查询而没有偏移量和限制时才能使用代码

1 个答案:

答案 0 :(得分: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 />';
        }
    }
}