在某些情况下,我该怎么做才能使这个 SQL 返回结果?

Posted

技术标签:

【中文标题】在某些情况下,我该怎么做才能使这个 SQL 返回结果?【英文标题】:What can I do to make this SQL return results in certain situations? 【发布时间】:2011-01-02 00:14:54 【问题描述】:

在某些情况下,我可以使用一些帮助来使此搜索返回结果。用户有 2 个字段要填写,我希望能够留空或填写两者。这些字段是车辆和关键字。车辆字段旨在允许根据品牌、型号、VIN、卡车号码(通常是 2 - 3 位数字或字母前缀后跟 2 位数字)以及属于卡车表的一些其他字段进行搜索。关键字用于搜索维护和维护零件表中的大多数字段(例如工作描述、零件名称、零件编号)。目前将关键字字段留空不会返回任何结果,即使车辆字段有自己的有效结果。

"SELECT M.maintenance_id, M.some_id, M.type_code, M.service_date, M.mileage, M.mg_id, M.mg_type, M.comments, M.work_done,
                MATCH( M.comments, M.work_done) AGAINST( '$keywords' ) +
                MATCH( P.part_num, P.part_desc, P.part_ref) AGAINST( '$keywords' ) +
                MATCH( T.truck_number, T.make, T.model, T.engine, T.vin_number, T.transmission_number, T.comments) AGAINST( '$vehicle' )
                AS score
            FROM maintenance M, maintenance_parts P, truck T
            WHERE M.maintenance_id = P.maintenance_id
            AND M.some_id = T.truck_id
            AND M.type_code = 'truck'
            AND (MATCH( T.truck_number, T.make, T.model, T.engine, T.vin_number, T.transmission_number, T.comments) AGAINST( '$vehicle' )
            OR T.truck_number LIKE '%$vehicle%')
            AND MATCH( P.part_num, P.part_desc, P.part_ref) AGAINST( '$keywords' )
            AND MATCH( M.comments, M.work_done) AGAINST( '$keywords' )
            AND M.status = 'A' GROUP BY maintenance_id ORDER BY score DESC LIMIT 0, $limit";

【问题讨论】:

“我可以使用一些帮助来提高搜索效率并找到更好/更多的结果” - 依据什么标准? 我主要担心的是,当关键字字段为空时,即使车辆字段中输入的内容有有效结果,它也找不到任何结果。 @Josh:那么我建议您编辑您的问题以反映这一点 这对我来说听起来像是打破了第一个正常形式。我认为将多个值组合到单个列中不是一个好习惯。如果我读得太快,请纠正我。 @duffymo - 你在谈论“匹配(M.cmets,M.work_done)反对('$keywords')+匹配(P.part_num,P.part_desc,P.part_ref)反对('$keywords') + MATCH(T.truck_number, T.make, T.model, T.engine, T.vin_number, T.transmission_number, T.cmets) AGAINST('$vehicle') AS 分数”?跨度> 【参考方案1】:

您需要将一些 AND 更改为 OR,然后将 OR 括起来。

现在您需要 $vehicle MATCHes 之一和 $keyword 匹配both。相反,我认为您需要任何 $vehicle $keyword 匹配项。

另外,我认为您可以将 $keyword 匹配项合并到一个 MATCH 调用中,不是吗?而且我认为对 T.truck_number 的 LIKE 检查是多余的,因为 MATCH 包含该列。在这种情况下,您可以将 SQL 的该部分编写为:

 AND (MATCH( T.truck_number, T.make, T.model, T.engine, T.vin_number,
      T.transmission_number, T.comments) AGAINST( '$vehicle' )
     OR MATCH( P.part_num, P.part_desc, P.part_ref,M.comments, M.work_done) 
     AGAINST( '$keywords' ))

我还附上了关于通过转义您创建的动态 SQL 来保护自己免受 SQL 注入的强制性评论。

【讨论】:

以上是关于在某些情况下,我该怎么做才能使这个 SQL 返回结果?的主要内容,如果未能解决你的问题,请参考以下文章

我该怎么做才能使整数每次都随机[重复]

我该怎么做才能使href文本可以通过c#更改?

在Python上读取文件时,我得到了一个UnicodeDecodeError。我该怎么做才能解决这个问题?

我可以在没有苹果开发者帐户的情况下在真正的苹果设备上测试我的 Flutter 应用程序吗?如果可以,我该怎么做?

我该怎么做才能有没有符号的数字?

我的图像在图像滑块上看起来很糟糕 - 我该怎样做才能使我的图像看起来不舒展?