【问题标题】:2 MySQL Queries can't be combined?2 MySQL 查询不能合并?
【发布时间】:2014-04-01 20:24:14
【问题描述】:

我得到了以下 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),它总是只有 1 个条目。 table2 也有 'ziparea' 列,但有时每个 ziparea 有超过 1 个条目(例如:ziparea '24' 有 5 个条目;表示 5 行)

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

问题是 - 即使 table1 中只有 1 个条目 - 它总是提供尽可能多的行,因为 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 中的“ziparea”列有多个条目。 ....如果我然后使用<?php echo utf8_encode($tender["tenderName"]); ?> 它会给我5倍相同的tenderName,即使只有一个tenderName...它似乎填满了table2中的行...这重复了我的html内容( 5x)

标签: php mysql sql join multiple-columns


【解决方案1】:

你错了。连接查询 选择 * FROM table1 t1, table2 t2 on t1.ziparea = t2.ziparea WHEREtenderID='".$_REQUEST["tenderID"]."'"

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 />";

}

【讨论】:

  • 是的,但如果我想输出 &lt;?php echo utf8_encode($tender["tenderName"]); ?&gt; 我会得到 5 次“这是一个测试”,这意味着我的网页内容会重复......这就是问题......我已经为第一个查询尝试了“LIMIT 1”,但即使使用 LIMIT 1 我也得到 5 个输出
  • 不是问题。是因为加入的“正常”情况。你不能简单地做一个回声。你必须迭代你的结果格式,就像你需要显示它一样
  • 如何迭代table1的所有信息只有1个输出的结果?
  • 但是当我输出 $tender["tender Name"] 时,它会输出 5 次 "test",不是吗?
  • 没有。它只打印一次。因为 print $tender["tender Name"] 只有当tenderid改变时。在你的情况下,你只有一个招标,然后只打印一次
【解决方案2】:

表之间存在一对一或多的关系。如果您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>';

【讨论】:

  • 感谢您的回答...对不起图片,但现在您误解了...我从不想用我的php输出复制屏幕截图,屏幕截图应该只显示表格结构.....我的输出在这个php页面上,问题是table1中的数据是repeater..当我用while语句输出它时,我得到5倍的网页内容......i.stack.imgur.com/ezCJK.jpg
  • 啊,我现在明白了。仍然可以应用相同的原理。抑制多余的 Dasist ein test 部分并重复从 table2 查询创建的所需部分。此外,@mark-baker 是非常正确的。你真的应该清理你的输入。见PHP: Sanitize filters - Manual
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多