2013-03-22 86 views
1

我有兩個MySQL表。表「dbt1」具有帶主鍵「UID」的唯一記錄。一對多的數據庫輸出 - 多個循環或查詢?

表「dbt2」使用該密鑰,但每個UID有多個記錄。

使用PHP和正確的MySQL查詢,如何從dbt1中獲取記錄,然後查看dbt2以查找具有相同UID的所有記錄,然後連續打印直到完成。然後,返回並從dbt1打印下一條記錄,直到where子句滿足爲止?

這是我到目前爲止有:

查詢:

$dbname = 'ext'; 
$dbt1 = 'questions'; 
$dbt2 = 'stats'; 
$data = "questions.UID qUID, QUESTION, ANSWER_A, ANSWER_B, ANSWER_C, ANSWER_D, FIGURE, CCAstats.UID sUID, DATE, PROP, CRPBI";  

$mysql_link = mysql_connect($dbhost,$dbuser,$dbpass); 
$sql = ("SELECT $data FROM $dbt1 LEFT JOIN $dbt2 ON $dbt1.UID = $dbt2.UID WHERE $dbt1.SECTION = $section ORDER BY $dbt1.UID;"); 
$results = mysql_db_query($dbname,$sql) or die("no results"); 

if ($results) 
{ 
    while($row = mysql_fetch_assoc($results)) 
{ 
     print "$row[qUID]"." "."$row[QUESTION]"."<br>"; 
     print "A. $row[ANSWER_A]"."<br>"; 
     print "B. $row[ANSWER_B]"."<br>"; 
     print "C. $row[ANSWER_C]"."<br>"; 
     print "D. $row[ANSWER_D]"."<br>"; 
     print "$row[FIGURE]"."<br>"; 
     print "$row[DATE]".", "."$row[PROP]".", "."$row[CRPBI]"."<br>"; 
    } 

    mysql_free_result($results); 
} 
mysql_close(); 

本工程以輸出基於主題(作爲POST變量傳遞)的所有結果,並重復輸出,如果有一個以上$ dbt2中的任何給定記錄中的一條記錄。

問題是,我不希望$ dbt1的重複輸出。我想爲$ dbt1中的所有記錄返回一個條目,並且$ dbt2中的記錄與$ dbt1中的UID相關。合理?

因此,輸出會是這樣的:

UID QUESTION 1 
A. ANSWER A 
B. ANSWER B 
C. ANSWER C 
D. ANSWER D 
DATE, PROP, CRPBI 
DATE{2}, PROP{2}, CRPBI{2} 

UID QUESTION 2 
A. ANSWER A 
B. ANSWER B 
C. ANSWER C 
D. ANSWER D 
DATE, PROP, CRPBI 
DATE{2}, PROP{2}, CRPBI{2} 

我的問題是,我需要另一個循環的地方從$ DBT2得到所有的結果,或者是有什麼我可以在查詢呢?我需要第二個查詢嗎?我需要爲任何給定的UID報告每個$ dbt1記錄的所有$ dbt2條目。我覺得我甚至不能正確地問這個問題......對不起。

回答

1

您沒有查詢問題。你正在查詢(據我所知)。你有一個DISPLAY的問題。本質上你需要給你循環一些內存,創建一個簡單的狀態機:

$prev_dbt1 = null; 
while($row = mysql_fetch($result)) { 
    if ($prev_dbt1 <> $row['dbt1']) { 
     ... display new table header ... 
     $prev_dbt1 = $row['dbt1']; // update for next loop 
    } 
    display other stuff as usual 
} 
+0

謝謝。我確實有顯示問題。我似乎無法獲得任何給定的dbt1結果的多個dbt2記錄。你提供的代碼似乎也沒有做到這一點。對於dbt1中的每個匹配,我仍然只從dbt2獲得一條記錄。如果dbt1中dbt1中有多條記錄,那麼我會重複dbt1中的所有內容......當我真正想要的是dbt2時,因爲我已經有了dbt1的東西! :-) – 2013-03-22 22:16:27

+0

你的解決方案與這個非常相似:http://stackoverflow.com/questions/6358902/properly-display-results-of-mysql-one-to-many-query哪些不適合我。嗯... – 2013-03-22 22:30:13

0

這就是我想出來的。它的工作原理,但我不知道它有多高效。幸運的是,我的桌子很小。

$query1 = "SELECT * FROM $dbt1 WHERE $dbt1.SECTION = $section ORDER BY $dbt1.UID"; 
$query1Result = mysql_db_query($dbname,$query1) or die("no query"); 

while ($row = mysql_fetch_assoc($query1Result)) 
{ 
    echo $row['UID']." ".$row['QUESTION']."\n"; 
    echo $row['ANSWER_A']."\n"; 
    echo $row['ANSWER_B']."\n"; 
    echo $row['ANSWER_C']."\n"; 
    echo $row['ANSWER_D']."\n"; 
    echo $row['FIGURE']."\n"; 
    $query2 = "SELECT * FROM $dbt2 WHERE $row[UID] = $dbt2.UID ORDER BY $dbt2.DATE"; 
    $query2Result = mysql_db_query($dbname,$query2) or die("no query2"); 
    while ($stat = mysql_fetch_assoc($query2Result)) 
    { 
     echo $stat['DATE']."\n"; 
     echo $stat['PROP']."\n"; 
     echo $stat['CRPBI']."\n\n"; 
    } 

}