【问题标题】:MYSQL Boolean search using table data in same statement在同一语句中使用表数据进行 MYSQL 布尔搜索
【发布时间】:2013-11-13 16:28:13
【问题描述】:

我正在寻找执行以下操作的最有效方法。

我有“table1”和以下列, ID 已保存搜索 价格 新低价

我需要做的是从表 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;

它在更新中显示“反对的参数不正确”。 提前致谢!

【问题讨论】:

    标签: mysql sql stored-procedures boolean-search


    【解决方案1】:

    从逻辑上讲,您所做的事情应该是有意义的,但不幸的是,MySQL 的 AGAINST() 函数不允许您在搜索字符串中引用列。参数必须是固定字符串,or else a query parameter

    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. 当最低价格低于当前记录的相应参数 2 搜索词的最低价格时,更新您的 tmp 表。

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

    我在上面的例子中使用了命名参数,就像你对 PHP 的 PDO 所做的那样。但在存储过程语言中,您只能将位置参数与? 占位符一起使用。

    编写循环遍历查询结果并在循环内运行内部查询的存储过程可能很棘手。这是一个很好的博客,展示了如何做到这一点:Nesting MySQL Cursor Loops by Roland Bouman

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 2012-04-10
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 2013-12-10
      相关资源
      最近更新 更多