1

以下を行う最も効率的な方法を探しています。

次の列を持つ「table1」があります。 ID SavedSearch Price NewLowerPrice

私がする必要があるのは、テーブル 1 から ID と価格を選択し、別のテーブルに対するブール検索で、ユーザーが保存したすべての検索に対して新しい最低価格が設定されている場合は、新しい低価格にフラグを立てることです。ここに私が使用しているコードがありますが、次のブール検索で table1 の保存された検索を使用する方法について行き詰まっています

drop temporary table if exists tmp;

CREATE TEMPORARY TABLE tmp(
ID INT,
Param2 Varchar(300),
LowestPrice decimal(10,2),
LowerPrice bit,
PRIMARY KEY(ID)) ENGINE=MEMORY;

INSERT INTO tmp
SELECT id, Param2, LowestPrice, 0
FROM saved_searches
where user = 28;


UPDATE tmp
set LowerPrice = 1
WHERE (
SELECT MIN(price)
FROM store_sales 
WHERE MATCH (description) AGAINST (concat('\'', tmp.Param2, '\'') IN BOOLEAN MODE)) > 0;

「AGAINSTへの引数が正しくありません」という更新でエラーが発生します。前もって感謝します!

4

1 に答える 1

1

論理的には、意味のあることを行っていますが、残念ながら、MySQL の AGAINST() 関数では、検索文字列内の列を参照できません。引数は固定文字列にするか、クエリ パラメータにする必要があります。

http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.htmlは次のように述べています。

検索文字列は、クエリの評価中に定数である文字列値である必要があります。これは、たとえば、行ごとに異なる可能性があるため、表の列を除外します。

これは難しい方法で行う必要があります。

  1. すべての個別の検索パラメーターを照会します。

    SELECT DISTINCT Param2 FROM saved_searches;
    
  2. 各 Param2 値について、最小価格を照会します。

    SELECT MIN(price)
    FROM store_sales 
    WHERE MATCH (description) AGAINST (:param2) IN BOOLEAN MODE)) > 0;
    
  3. その最小価格が、それぞれの param2 検索用語で現在記録されている最低価格よりも低い場合は、tmp テーブルを更新します。

    UPDATE tmp
    set LowerPrice = 1
    WHERE LowestPrice > :minPrice Param2 = :param2
    

上記の例では、PHP の PDO で行うように、名前付きパラメーターを使用しています。?ただし、ストアド プロシージャ言語では、プレースホルダーで位置パラメーターのみを使用できます。

クエリの結果をループし、ループ内で内部クエリを実行するストアド プロシージャをコーディングするのは難しい場合があります。これを行う方法を示す良いブログがあります: Roland Bouman による Nesting MySQL Cursor Loops

于 2013-11-13T16:54:16.300 に答える