2015-04-12 4 views
2

У меня есть база данных, как это:поиска несколько полей MySQL

ID | Name | Model | Type 
1 | Car | 4  | C 
2 | Bar | 2  | B 
3 | Car | 4  | D 
4 | Car | 3  | D 

и форму, как это:

Name : 
Model : 
Type : 

Теперь я хотел бы искать только имя, например «автомобиль» и он возвращает линии 1, 3, 4. (я оставил модель и тип пустым)

Если я ищу «Автомобиль» в названии и 4 в Модели, он возвращает строки 1, 3. (Я оставил тип пустым)

И если я ищу «Автомобиль» в названии и «D» в «Тип», он возвращает строку 3, 4 (я оставил модель пустым)

Возможно ли это сделать в одном запросе?

Это то, что я имел:

SELECT * 
FROM items 
WHERE (:name IS NOT NULL AND name = :name) 
AND (:model IS NOT NULL AND model = :model) 
AND (:type IS NOT NULL AND type = :type) 

Но это не работает. Я хотел бы заполнить только 2 на 3 поля, а «WHERE» адаптируется и игнорирует пустое поле.

EDIT 1: Немного трудно объяснить, но у меня есть форма. Я хочу иметь только одно обязательное поле, два других являются необязательными, но если я также заполняю одно или два других поля, они действуют как фильтр.

Поэтому поле имени требуется (в форме). Если я заполню только поле имени, он будет выбирать только имя name =: name. Если я наберу имя + модель, он выберет, где name =: name AND model =: model. и т. Д.

Благодарим за помощь.

+2

Используйте 'OR' не' AND' для дополнительных параметров. '(: name IS NOT NULL AND name =: name) OR (: model NOT NOT, NULL AND model =: model)' – chris85

+0

Вы также можете сделать переменную 'where' и добавить только значения, которые вам нужны, с помощью условных выражений и в условности связывают. – chris85

+0

@ chris85 Спасибо Крис. Проблема с OR заключается в том, что если я буду искать Car in Name и 4 в Model, появится даже строка 4 (Car-3) ... – cyclone200

ответ

3

Вот альтернативный подход с использованием PHP. Вам нужно будет обновить переменные.

<?php 
$query = 'SELECT * 
FROM items 
WHERE 1 = 1 '; 
//below used for testing can be remove 
//$_GET['name'] = 'test'; 
//$_GET['car'] = 'test2'; 
//$_GET['type'] = 'test3'; 
if(!empty($_GET['name'])) { 
    $query .= ' and name = ? '; 
    $params[] = $_GET['name']; 
} 
if(!empty($_GET['car'])) { 
    $query .= ' and car = ? '; 
    $params[] = $_GET['car']; 
} 
if(!empty($_GET['type'])) { 
    $query .= ' and type = ? '; 
    $params[] = $_GET['type']; 
} 
if(!empty($params)) { 
    $dbh->prepare($query); 
    $sth->execute($params); 
    //fetch 
} else { 
    echo 'Missing Values'; 
} 

1=1 поэтому вы можете добавить and search field для каждого поля со значением в противном случае вы должны были бы увидеть, если бы уже был установлен.

+0

Это именно то, что я имел в виду!Мне просто пришлось заменить '$ dbh-> prepare ($ query);' с '$ sth = $ dbh-> prepare ($ query);' во избежание ошибки переменной. Еще раз спасибо! – cyclone200

4

Я не уверен, что вы подразумеваете под «пустым», но при условии, вы имеете в виду NULL, вы можете сделать что-то вроде этого:

SELECT * 
FROM items 
WHERE (:name IS NULL OR name = :name) AND 
     (:model IS NULL OR model = :model) AND 
     (:type IS NULL OR type = :type); 

Эта проблема с этим запросом является то, что это очень трудно для MySQL использовать индексы для него, из-за условий or. Если у вас большой объем данных и вы хотите использовать индексы, тогда вы должны построить предложения where на основе параметров, которые фактически имеют данные.

+0

Немного сложно объяснить, но у меня есть форма. Я хочу иметь только одно обязательное поле, два других являются необязательными, но если я также заполняю одно или два других поля, они действуют как фильтр. – cyclone200

Смежные вопросы