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

时间:2011-01-02 00:14:54

标签: mysql sql

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

"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";

1 个答案:

答案 0 :(得分:1)

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

现在你需要$ vehicle MATCHes中的一个以及$ keyword匹配的两个。相反,我认为您需要任何一个$ 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注入的强制性评论。