2

我在这里创建了一个问题,我认为这有点臃肿。在这里略过这个问题是我的要求:

我需要创建 3 个 mySQL 查询来获取该行中的所有信息,以便我可以将信息格式化为一个 HTML 表。

这是我选择所有内容的查询:

$qry_questions = mysql_query("SELECT * FROM mbr_qa_questions ORDER BY q_votes DESC);
while($row = mysql_fetch_array($qry_questions){
    //Grab all information
}

现在,我需要进行三个与上述类似的查询,但我需要它来执行以下操作:

pull everything from every third row in a table starting at row #1
pull everything from every third row in a table starting at row #2
pull everything from every third row in a table starting at row #3

然后我会将这些查询中的每一个放入 3 列之一。

我不能通过唯一 ID 做到这一点。是的,它是一个自动递增的 ID,但我可能不得不将整行移动到另一个表中。

编辑:我已经添加了对每一行进行计数并将查询结果放入正确的“bin”的尝试

//GIVE EACH ENTRY A COLUMN NUMBER
$count++;
if($count >= 4){
    $count = 1; 
}?> 

<div class="col" id="col-1">
    <?PHP
    while($count == 1){
        include("pieces/answers/newAnswerLayout.php"); 
    }
    ?>
</div>
<div class="col" id="col-2">
    <?PHP
    while($count == 2){
        include("pieces/answers/newAnswerLayout.php"); 
    }
    ?>
</div>
<div class="col" id="col-3">
    <?PHP
    while($count == 3){
        include("pieces/answers/newAnswerLayout.php"); 
    }
    ?>
</div>
4

3 回答 3

4

这是获取 MySQL 返回的结果集的一种方法。(但只返回所有行并在应用程序中每隔三行获取一次可能会更容易)。但它可以很容易地在 MySQL 中完成。请注意,您的原始查询包含在括号中(作为内联视图),别名为r.

SELECT r.*
  FROM ( 
         SELECT *
           FROM mbr_qa_questions
          ORDER BY q_votes DESC
       ) r
 CROSS
  JOIN ( SELECT @i := 0 ) s
HAVING ( @i := @i + 1) MOD 3 = 1

这将从第一行开始每隔三行返回一次。要从第 2 行和第 3 行开始每隔三行,请将= 1HAVING 子句中的文字替换为= 2or = 3(分别)。

于 2012-12-18T23:08:08.070 回答
2

为什么需要三个不同的查询?相反,您是否不能保留您拥有的单个查询,有一个在循环的每次迭代中递增的计数器,并且在 %3 上执行您对案例 #1、#2 或 #3 所做的任何事情?

于 2012-12-18T22:58:04.217 回答
0

您可能可以只使用计数器以更简单的方式执行此操作,但我会这样做:

$questions = array();
$results = mysql_query("SELECT * FROM mbr_qa_questions ORDER BY q_votes DESC");

while($row = mysql_fetch_array($results)){
    $questions[] = $row;
}

for($i = 0; $i < count($questions); $i++) {
  if($i + 1 % 3 == 0) {
     $questions[$i];//this is a 3rd, so do something with it
  }
}
于 2012-12-18T23:06:43.017 回答