比较记录是否存在于另一个表中

时间:2014-04-08 01:53:49

标签: php mysql sql

这里我有html表显示来自数据库的记录。如果value1已经在table1和table2中,我试图禁用或取消删除按钮。我在while循环中获取另一个while循环以从table2获取值。但我的问题是当我试图运行它时,只有1行/记录被禁用或无效。它仅选择数据库中的第一条记录。如何将所有item_code存储在一个变量中?请帮忙!

如下图所示,圆珠笔和mimeo纸已经在table2中,但是圆珠笔删除按钮没有空白。

enter image description here

$query1 = $mysqli1->query("select * from code WHERE item LIKE '%$search%' OR item_code LIKE '%$search%' OR cat_code LIKE '%$search%' order by item_code ASC");

while($r = $query1->fetch_assoc()){
echo"<tr>
    td>".$r['item']."</td>
    <td>".$r['cat_code']."</td>
    <td>".$r['item_code']."</td>";

result2 = $mysqli->query("SELECT item_code FROM app order by id ASC");
        while($rows = $result2->fetch_assoc()){
            $ok = $rows['item_code'];
            }
        if($ok != $r['item_code']) {
            echo "<td><a href='#' id='".$r['id']."' class='del'><img src='../images/del.png'></a></td>";
        } else {
        echo "<td><a href='javascript:void(0)'><img src='../images/stop.png' border='0' width='10' height='10' title='Already Add in Purchase Request' style='cursor: not-allowed;'></a></td>";
        }
        echo"</tr>";
        }

1 个答案:

答案 0 :(得分:0)

使用以下代码

尝试
<?php
$query1 = $mysqli1->query("select * from code WHERE item LIKE '%$search%' OR item_code LIKE '%$search%' OR cat_code LIKE '%$search%' order by item_code ASC");
$ok = false;

while($r = $query1->fetch_assoc()){
    $ok = false;
    echo"<tr>
            <td>".$r['item']."</td>
            <td>".$r['cat_code']."</td>
            <td>".$r['item_code']."</td>";

        $result2 = $mysqli->query("SELECT item_code FROM app order by id ASC");
        while($rows = $result2->fetch_assoc()){
            if($r['item_code'] == $rows['item_code']) {
                $ok = true;
                break;
            }
        }
        if(!$ok) {
            echo "<td><a href='#' id='".$r['id']."' class='del'><img src='../images/del.png'></a></td>";
        } else {
            echo "<td><a href='javascript:void(0)'><img src='../images/stop.png' border='0' width='10' height='10' title='Already Add in Purchase Request' style='cursor: not-allowed;'></a></td>";
        }

        echo"</tr>";
}

我做了什么,将$ ok转换为标志变量(boolean),并且主循环的每次迭代,我将该变量重置为false(未找到)。我还在内循环中移动了字段检查,如果找到匹配,我设置$ ok = true(匹配找到),并优雅地退出循环(break;)。

当你知道查询是静态的(“SELECT foo FROM bar ORDER BY id ASC”)时,我会看到我是否可以将这些代码清理干净,因为可以通过预填充来更好地处理在SQL命令中使用ARRAY或简单的“IN()”就足够了。

以下是处理此问题的更为优雅的方式

假设'app'和'code'表都在同一个数据库中。

$query1 = $mysqli1->query("SELECT
*,
(SELECT COUNT(app.item_code) FROM app WHERE app.item_code=code.item_code) as `mycheck`
FROM
code,
app
WHERE item LIKE '%$search%' OR item_code LIKE '%$search%' OR cat_code LIKE '%$search%' order by item_code ASC";

while($r = $query1->fetch_assoc()){
    echo"<tr>
            <td>".$r['item']."</td>
            <td>".$r['cat_code']."</td>
            <td>".$r['item_code']."</td>";

        if(intval($r['mycheck']) == 0) {
            echo "<td><a href='#' id='".$r['id']."' class='del'><img src='../images/del.png'></a></td>";
        } else {
            echo "<td><a href='javascript:void(0)'><img src='../images/stop.png' border='0' width='10' height='10' title='Already Add in Purchase Request' style='cursor: not-allowed;'></a></td>";
        }

        echo"</tr>";
}

在此示例中,我修改了原始查询以加入您在内部循环中搜索的相同结果的 COUNT ,作为名为“mycheck”的字段。然后检查该字段是否具有大于0的整数值是一件简单的事情,如果是,则表示另一个表中存在记录。在非常大的数据库上,这可能需要稍长的时间才能执行,但总体来说它会更快并节省与数据库的连接,并且总计结果一次性传递:)