0

私のスクリプトは要件を満たしていますが、この理由で数千のクエリを実行するため、50〜65秒かかります。私は代替の、よりエレガントで迅速な解決策を探しています。

SELECT GROUP_CONCAT(DISTINCT BatchNo SEPARATOR ', ') AS picklists, web_company_name
FROM PickBatch 
LEFT JOIN customer_master ON customer_master.VC_CUSTOMER_CODE = PickBatch.Customer
GROUP BY Customer

これにより、4334、3443、3341、4543などの列の選択リストが返されます

その後、別の列と1つずつ比較する必要があります

while( $row=mysql_fetch_array($res) )
{   
     $picklists = explode(', ', $row['picklists']);
     $pickString = '';
     foreach($picklists as $batch)
     {
         //invoiced
         $sql2 = "SELECT invoice_no FROM invoice_web_order WHERE FIND_IN_SET('$batch', frombatch) LIMIT 1";
         $res2 = mysql_query($sql2) or die(mysql_error());
         if ( mysql_num_rows($res2) > 0 )
         {
             continue;
         }   
        $pickString .= "$batch, ";
    }
    echo $pickString;
}

したがって、たとえば、4334、3443、3341、4543を、たとえば「frombatch」の3892、4890、3341、2389と比較すると、3343は除外されます。

同じことをする他の方法はありますか?4334、3443、4543だけが返されるように?

4

2 に答える 2

0

テーブルの定義を教えてください。

SELECT 
    DISTINCT BatchNo as BN, 
    GROUP_CONCAT(DISTINCT BatchNo SEPARATOR ', ') AS picklists, 
    web_company_name
FROM PickBatch
LEFT JOIN customer_master ON customer_master.VC_CUSTOMER_CODE = PickBatch.Customer
WHERE PickBatch.BN <>      (SELECT frombatch 
                            FROM invoice_web_order 
                            WHERE FIND_IN_SET(PickBatch.BN, frombatch)
                            LIMIT 1)
GROUP BY Customer
于 2012-05-09T13:17:58.710 に答える
0

invoice_web_orderテーブルのどの行のfrombatch列にもまだ存在していない、PickBatchに存在するバッチ番号を知りたいだけのようです。

Table: PickBatch
BatchNo
4334
3443
3341
5453

Table: invoice_web_order
frombatch
3982, 4890, 3341, 2389
####, ####, ####
####, ####, ####, ####

SELECT DISTINCT batchno FROM PickBatch LEFT JOIN invoice_web_order ON FIND_IN_SET(batchno, frombatch) WHERE invoice_web_order.frombatch IS NULL

あなたもCUSTOMERによってグループ化されましたが、その理由はわかりません。あなたが説明すれば、私は適切な場合、このソリューションにそれを組み込むのを手伝うことができます。

于 2012-05-09T13:21:52.330 に答える