在某些情况下,我该怎么做才能使这个 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 返回结果?的主要内容,如果未能解决你的问题,请参考以下文章
在Python上读取文件时,我得到了一个UnicodeDecodeError。我该怎么做才能解决这个问题?