Что я могу сделать, чтобы этот SQL возвращал результаты в определенных ситуациях? - PullRequest
1 голос
/ 02 января 2011

Я мог бы использовать некоторую помощь, чтобы этот поиск возвращал результаты в определенных ситуациях. У пользователя есть 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 Ответ

1 голос
/ 02 января 2011

Вам необходимо изменить некоторые из своих AND на OR, а затем заключить в скобки OR.

Сейчас вам требуется один из совпадений $ vehicle, а также оба соответствия ключевого слова $.Вместо этого я думаю, что вы хотите запросить одно из совпадений ключевых слов $ vehicle или $.

Также я думаю, что вы можете объединить совпадения ключевых слов $ в один вызов MATCH, можетене так ли?И я думаю, что проверка LIKE против T.truck_number является избыточной, учитывая МАТЧ, включающий этот столбец.В этом случае вы можете написать этот раздел 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...