特定の時点まで機能するこのストアドプロシージャがあります
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_RunSearchPostFilter`(vResultTable VARCHAR(64))
BEGIN
IF (SELECT COUNT(*) FROM groupuser u, groups g WHERE u.GroupID=g.GroupID AND g.GroupName REGEXP 'design_group' AND u.UserID=@vUserID) THEN
SET @prep=CONCAT("
DELETE r FROM ", vResultTable, " r
JOIN file f ON r.FileID = f.FileID
JOIN path p ON f.PathID = p.PathID
JOIN keyword1 k1 ON f.FileID = k1.FileID
AND k1.Field136 = 'Prep'
OR (
*code to hide files within directories with k1.Field136="Prep"*
)
;");
PREPARE sprep FROM @prep;
EXECUTE sprep;
DEALLOCATE PREPARE sprep;
END IF;
END
vResultTable
基本的に、次のようなパラメーター IN (と呼ばれる)としてストアド プロシージャに渡される一時テーブルがあります
。
次に、テーブル間でデータを取得するために関与する次の 3 つのテーブルがあり
ます。
パス (PathID、パス);
キーワード 1 (ファイル ID、フィールド 136);
結果テーブル (vResultTable) は、基本的にファイル ID のリストにすぎません。これらのファイル ID の一部には、keyword1 テーブルに列 (Field136) があり、値は "Prep" です。これらの ID は、ファイルまたはディレクトリである可能性があります。それらがファイルである場合、問題はありません。正確に一致するものを見つけ、それらの ID を結果テーブルから削除できるからです。私が直面している問題は、これらの ID がディレクトリである場合です。keyword1.Field136 に「Prep」という値を持つフォルダーの 1 つにあるすべてのファイル (Field136 列に値を持たない) を削除する必要があるためです。一時テーブルを作成し、「Prep」値を持つファイル/ディレクトリのすべての ID を保存してからループしようとしましたが、機能しません。上記の SP は、値が「Prep」のファイルに関しては機能します。
元。vResultTable (IDs) 5 <--- "image1.jpg" has keyword1.Field136 = "Prep" なので問題なく削除
64 <--- "anchor.png" 値はありませんが、フル パスは "/Xinet_Volume/ Images/Lot1/Folder1/anchor.png" ディレクトリ "Lot1" には keyword1.Field136 = "Prep" があるため、このファイルは結果テーブルから削除する必要があります
2 <--- "house.pdf" 値がなく、ant ディレクトリ内にありません
4 <--- "005.pdf" ID=64 と同じ。
私はこの問題を何日も解決しようとしましたが、疲れ果てています。私はすべての選択肢を使い果たしました。これを手伝ってくれる慈悲深い人が必要です。
読んでくれてありがとう。