簡體   English   中英

比較記錄(如果存在於另一個表中)

[英]Comparing records if exist in another table

在這里,我有html表顯示記錄來自數據庫。 如果table1和table2中都已存在值,我試圖禁用或取消刪除按鈕。 我在while循環中獲取另一個while循環,以從table2中獲取值。 但是我的問題是當我嘗試運行此命令時,只有1行/記錄被禁用或為空。 它僅選擇數據庫中的第一條記錄。 如何將所有item_code存儲在一個變量中? 任何幫助,請!

就像下面的圖片一樣,圓珠筆和mimeo紙已經在table2中,但是圓珠筆刪除按鈕並不是無效的。

在此處輸入圖片說明

$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>";
        }

使用以下代碼嘗試

<?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轉換為標志變量(布爾值),並且在主循環的每次迭代中,我都將該變量重置為false(未找到)。 我也將字段檢查移到了內部循環中,如果找到匹配項,則設置$ ok = true(找到匹配項),然后正常退出循環(break;)。

如果您知道查詢是靜態的(“ SELECT foo FROM bar ORDER BY id ID ASC”),則可以通過在數據庫中循環循環來清理這段代碼,可以通過預先填充陣列或SQL命令中的一個簡單的'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是一件簡單的事情,如果是,則意味着該記錄存在於另一個表中。 在非常大的數據庫上,這可能需要稍長的時間才能執行,但是總體而言,這樣做會更快,並且可以節省與數據庫的連接,所有結果可以一次全部交付:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM