2 MySQL查询无法合并?

时间:2014-04-01 20:24:15

标签: php mysql sql join multiple-columns

我得到了以下2个mysql_queries:

$result = mysql_query("SELECT * FROM table1 WHERE tenderID='".$_REQUEST["tenderID"]."'");
while($tender = mysql_fetch_array($result)) {
    $zippy = $tender["ziparea"];
    $zipResult = mysql_query("SELECT * FROM table2 WHERE ziparea = '".$zippy."'");
    while($zip = mysql_fetch_array($zipResult)) {
        ....
    }
}

第一个查询就像我希望它工作一样。

table1的列为'ziparea',但每个ziparea(01到99)只有始终一个条目。 table2也有“ziparea”列,但有时每个ziparea有超过1个条目(例如:ziparea'24'有5个条目;表示5行)

我需要来自两个表的所有信息,我尝试将两个查询与“JOIN”合并,但我无法解决问题,这也存在于顶部的代码中。

问题是,即使table1中只有一个条目 - 它总是提供尽可能多的行,因为table2将为查询2提供。

表示如果ziparea为24,而table1只有1行,带有ziparea'24'(当然只有1行带有匹配的tenderID),但table2有5行为ziparea'24',将有5行从查询一次乘以相同的值。

我无法弄清楚原因。

也许你有解决方案。

table1和table2的结构:

http://i.stack.imgur.com/YAXF6.png

2 个答案:

答案 0 :(得分:0)

你错了。连接查询     选择 *     FROM table1 t1,table2 t2 on t1.ziparea = t2.ziparea     哪里有招标='"。$ _请求["标签ID"]。"'"

table1和table2之间的

必须显示

tender tendername clientinfo tenderstart created byuser ziparea id ziparea customerid ... 
1 test thisisatest 12.12.1234 31.03.14 02:52 roy 24 50 10400 ...
1 test thisisatest 12.12.1234 31.03.14 02:52 roy 24 51 13723 ...
1 test thisisatest 12.12.1234 31.03.14 02:52 roy 24 52 23720 ...
1 test thisisatest 12.12.1234 31.03.14 02:52 roy 24 53 11237 ...
1 test thisisatest 12.12.1234 31.03.14 02:52 roy 24 54 24216 ...

你可以使用php来显示你想要的结果。

修改
要像你想要的那样打印,你可以这样做:

$tenderid = -1;
while($tender = mysql_fetch_array($result)) {
    if($tenderid != $tender["tenderid"]){
       $tenderid = $tender["tenderid"]
       echo $tender["tenderid"]. " ". $tender["tendername"] ... $tender["ziparea"];
     }
   echo $tender["id"]. " " . $tender["customerid"] ... "<br />";

}

答案 1 :(得分:0)

表之间存在一对一或多关系。如果你JOIN他们,你会得到table1的列,每个table2行重复一次。这就是它的工作原理。

如果您要做的是从HTML中复制屏幕截图中的输出(或者在Excel中通过说明文件类型),您可以执行table1查询,打印table1列,然后循环table2查询,打印第一行后的每一行的空白列。像这样:

$result = mysql_query("SELECT * FROM table1 WHERE tenderID='".$_REQUEST["tenderID"]."'");

print '<table>';
while($tender = mysql_fetch_array($result)) {
    print '<tr>';
    # Print your table1 columns
    print '<td>'.$tender['tenderID'].'</td>';
    ⋮
    print '<td>'.$tender['byUser'].'</td>';

    # Now loop on table2. The counter variable is to keep it neat.
    $zip_counter = 0;
    $zippy = $tender["ziparea"];
    $zipResult = mysql_query("SELECT * FROM table2 WHERE ziparea = '".$zippy."'");
    while($zip = mysql_fetch_array($zipResult)) {
        if ($zip_counter > 0) {
            # On table2 rows after the first, start the table row,
            # then print a blank column for each table1 column
            print '<tr>'
            print '<td/>';
            ⋮
            print '<td/>';
        }

        # Print the table2 columns
        print '<td'>.$zip['ziparea'].'</td>';
        ⋮
        print '<td'>.$zip['mail'].'</td>';
        print '</tr>';

        $zip_counter++;
    }
}
print '</table>';

另一个选项是在一个查询中完成所有操作,然后在第一个查询之后忽略重复的table1值。这可能更好,因为它可以保存table2查询的设置和拆卸。

$this_tender_id = $_REQUEST['tenderID'];
$result = mysql_query("SELECT t1.tenderID,
                              ⋮
                              t1.byUser,
                              t2.ziparea,
                              ⋮
                              t2.mail
                         FROM table1 t1
                         JOIN table2 t2 ON t2.ziparea = t1.ziparea
                        WHERE t1.tenderID = {$this_tender_id}
                      "
);

$row_counter = 0;

print '<table>';
while($row = mysql_fetch_array($result)) {
    print '<tr>';
    # For the first row, print the table1 columns,
    # otherwise print blank columns. 
    if ($row_counter == 0) {
        print '<td>'.$row['tenderID'].'</td>';
        ⋮
        print '<td>'.$row['byUser'].'</td>';
    }
    else {
        print '<td/>';
        ⋮
        print '<td/>';
    }

    # Print the table2 columns
    print '<td'>.$row['ziparea'].'</td>';
    ⋮
    print '<td'>.$row['mail'].'</td>';
    print '</tr>';

    $row_counter++;
}
print '</table>';