2013-03-22 83 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"; 
    } 

}