2012-12-18 109 views
2

我已經創建了一個問題Here我認爲這有點臃腫。爲了避免這個問題,這裏是我的要求:如何在mySQL中選擇每第n行開始於n

我需要創建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

這裏有一個方法,來獲得由MySQL返回的結果集。 (但是,返回所有行並獲取應用程序中的第三行可能會更容易)。但它可以很容易地在MySQL中完成。請注意,您的原始查詢包裝在parens(作爲內聯視圖)中,其別名爲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 

這將返回每第三行,從第一行開始。要從第二行和第三行開始每第三行,請將HAVING子句中的文字= 1替換爲= 2= 3(分別)。

+0

所以遠遠這是我需要看到的。我已經把它放到代碼中,它適用於列1和2,但它似乎沒有填充任何東西時,我說MOD 3 = 3我明白它是潛水的()3和其餘(= 1)是什麼應該顯示,我想我只是不能包圍我的頭 – ntgCleaner

+1

沒關係,我只是意識到,它應該說MOD 3 = 0,因爲3/3 = 1.0(.0是MOD正在尋找的東西)。這完美地回答了我的問題。謝謝! – ntgCleaner

+0

@ntgCleaner ... DOH!那是我的不好;我顯然沒有清楚地思考。當然,正如你所想的那樣,它需要是'MOD 3 = 0'來讓第三行從第三行開始。 DOH! – spencer7593

2

爲什麼你需要三種不同的查詢?你不能,而是保持你的單一查詢,有一個計數器在循環的每一次迭代中增加,並且在%3上爲你的情況#1,#2或#3做了什麼?

+0

我嘗試了這樣的失敗。我很想看到一個這樣的例子。如果你按照上面的鏈接,你可以看到原來的問題,並在那裏有一個鏈接與我想要做的一個例子。我試圖做一個增量計數器,然後當計數器== 1,把它放在第1列,而計數器== 2,把它放在第2列等 – ntgCleaner

+0

這是最有可能的路要走。如果您需要獲取所有行,只需在應用程序中處理您的「每第三行」邏輯即可。 –

+0

加入我分裂結果的嘗試 – ntgCleaner

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 
    } 
} 
+0

我認爲這是缺少一個步驟。您有查詢命名爲$ results,但沒有名稱爲$ qry_questions的while語句中的查詢。我目前正在嘗試這些選項 – ntgCleaner

+0

哦,這只是一個錯字抱歉。 $ qry_questions應該是$ questions – kennypu

+0

@ntgCleaner現在已經修復了 – kennypu