Запрос на поиск по БД

Тема в разделе 'MySQL', создана пользователем Xeon, 25 фев 2012.

Статус темы:
Закрыта.
  1. Xeon Новичок

    Здравствуйте, нужен пинок в правильную сторону.
    Имеется БД с вот такой структурой:
    [IMG]
    Т.е для каждого по сути слова свой столбец. И поэтому использовать привычную одну строку для поиска не совсем тут логично наверное.
    Поэтому форма поиска условно выглядит вот так:
    Имя:
    Фамилия:
    Отчество:
    Звание:
    и т.д

    Так вот вопрос. Как лучше организовать поиск по такой БД, с точки зрения SQL
    Я пробывал писать вот так:

    Но чего то с like не совсем это дело работает. Он мне просто выводит практически все записи из базы данных. А если писать AND то нужно что бы были заполнены все поля что не возможно по понятным причинам. Иначе не выводится вообще ни чего.
  2. XmP ADD ebx, 110h

    Да, это проблема.

    Но тут действительно нужен не OR а AND.

    К примеру у тебя есть переменные:
    PHP:

    $first
    $second
    .....
    Ну ты все входящие переменные(лучше сразу в HTML занести их в один массив), проверяешь на пустоту, пустые и нулевые/недействительные - удаляешь.

    Ну потом с помощью foreach динамически формируешь запрос с оставшимися переменными и используешь AND, ну и конечно скобки: WHERE (id LIKE'%(int)$id%') AND (...) AND (...)...

    Ну и так далее, и всё должно работать.
  3. Xeon Новичок

    Похоже то что нужно! Спасибо.
    Накидал пока так, буду тестить:
    PHP:

    $i 
    1;
    if (isset(
    $_GET['enter'])){
    //Присвоим переменным значение из строки поиска
    $first $_GET['first'] ? $_GET['first'] : 0
    $second $_GET['second'] ? $_GET['second'] : 0
    $area $_GET['area'] ? $_GET['area'] : 0
    $middle $_GET['middle'] ? $_GET['middle'] : 0
    $BD $_GET['BD'] ? $_GET['BD'] : 0
    $locality $_GET['locality'] ? $_GET['locality'] : 0
    $rank $_GET['rank'] ? $_GET['rank'] : 0;
    $military $_GET['military']? $_GET['military'] : 0;  
    //Создаем ассоциативный массив
    $array = array(
    "`first`" =>  $first,
    "`second`" => $second,
    "`middle`" => $middle,
    "`BD`" => $BD,
    "`locality`" => $locality,
    "`area`" => $area,
    "`rank`" => $rank,
    "`military`" => $military,
    );
    //Начальная строка запроса
    $sql  
    "SELECT * FROM global 
    INNER JOIN locality ON global.locality=locality.ID_l 
    INNER JOIN area ON global.area=area.ID_a  
    INNER JOIN military ON global.military=military.ID_m 
    INNER JOIN rank ON global.rank=rank.ID_r"
    ;
    $sql_where = array(); 
    //Перебираем массив 
    foreach($array as $key => $value) { 
    // Если есть 0 в запросе отсеиваем его 
    if(!empty($value)) $sql_where[] = $key." LIKE '%".($value)."%'";    

     
    $sql .=" WHERE "
     
    //Формируем окончательную строку запроса 
    $sql .=" ".implode(" AND "$sql_where); 
     
    //Собственно вот что получилось в запросе 
    //echo $search; 
    $search mysql_query($sql);
    while (
    $result mysql_fetch_assoc$search ) ){
    echo 
    " ".$i++.$result[second] $result[first] $result[middle] $result[BD] года рождения, Город: $result[locality] Район: $result[area] Звание: $result[rank] Часть: $result[military] ";
    echo 
    "<br>";
    }
  4. Xeon Новичок

    Оу. Отбой. Просто вот так верно:
    PHP:

    //Создаем ассоциативный массив
    $array = array(
    "`first`" =>  $first,
    "`second`" => $second,
    "`middle`" => $middle,
    "`BD`" => $BD,
    "locality.locality" => $locality,
    "area.area" => $area,
    "rank.rank" => $rank,
    "military.military" => $military,
    );
Статус темы:
Закрыта.

Поделиться этой страницей