За последние 24 часа нас посетили 68976 программистов и 1562 робота. Сейчас ищут 1198 программистов ...

критерий поиска в запросе "от и до"

Тема в разделе "PHP для новичков", создана пользователем serj011, 1 авг 2012.

  1. serj011

    serj011 Активный пользователь

    С нами с:
    18 апр 2010
    Сообщения:
    279
    Симпатии:
    0
    не знаю как правильно по уму реализовать!? может кто сталкивался?

    задача выбрать людей в заданном диапазоне возраста (от и до), в базе есть дата рождения человека...

    высчитать из даты рождения возраст я могу, а потом в запросе указать, если к примеру задано от 25 до 40, то найти всех где (возраст человека >25 and возраст человека < 40)...

    только у меня загвоздка, высчитать в запросе сколько лет каждому я могу только после do {, в цикле... а задать значение (возраст человека >25 and возраст человека < 40) нужно выше в запросе..!?)

    я придумал решение, но оно помоему не по уму... при регистрации сразу переводить ДР в возраст и заносить в базу, а потом уже указывать в запросе...

    да и если человек "постареет", то в критерий уже не попадет..))
     
  2. k.almas

    k.almas Активный пользователь

    С нами с:
    27 июл 2012
    Сообщения:
    36
    Симпатии:
    0
    Код (Text):
    1. Внутри SQL запроса WHERE age>25 AND age<40
    Как вариант

    Добавлено спустя 1 минуту 11 секунд:
    или тупо через иф елсе прогнать
     
  3. ALEXU

    ALEXU Активный пользователь

    С нами с:
    5 апр 2011
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Russia
    имхо. так нельзя делать. ведь каждый год вам будет нужно +1 делать)
    лучше ДР вычислять отдельно, а в запросе(как указано выше) уже выборку делать.
     
  4. serj011

    serj011 Активный пользователь

    С нами с:
    18 апр 2010
    Сообщения:
    279
    Симпатии:
    0
    я так же и писал, но как в SQL запрос добавить WHERE age>25 AND age<40, если age высчитывается ниже чем сам запрос, в цикле do????


    $result5 = mysql_query("SELECT anketa.*,foto_user.id_user,activ,users.avatar,bd_day,bd_month,bd_year,visiting_m,visiting_d,visiting_y,visiting_time,nik,city FROM anketa, foto_user, users WHERE users.id = anketa.id_user and ($lf_S) $city_S $albom_foto GROUP BY anketa.id ORDER BY id DESC LIMIT $start, $num",$db);

    if (mysql_num_rows($result5) > 0)
    {
    $myrow5 = mysql_fetch_array($result5);
    do {
    ...тут будем считать $age ????????????????
     
  5. k.almas

    k.almas Активный пользователь

    С нами с:
    27 июл 2012
    Сообщения:
    36
    Симпатии:
    0
    do while?

    Добавлено спустя 2 минуты 2 секунды:
    Я понял это только когда уже отправил, и поэтому предложил иф. а если по году рождения и нау вычислить?
     
  6. serj011

    serj011 Активный пользователь

    С нами с:
    18 апр 2010
    Сообщения:
    279
    Симпатии:
    0
    а можно побробнее, как именно через иф?

    ????????????????? тут не понял)
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Do...while не подходит для работы с бд.
     
  8. k.almas

    k.almas Активный пользователь

    С нами с:
    27 июл 2012
    Сообщения:
    36
    Симпатии:
    0
    А я как раз хотел ссылочку дать на мой топик, где игордата мне открыл глаза.
    http://www.php.ru/forum/viewtopic.php?f=9&t=41164
    хоия я do while в if запихивал, тогда он работает также как while!?
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    В Do...while условие стоит в конце цикла. Поэтому он тупо сначала что-то сделает. А потом только поинтересуется, не пустой ли ответ из бд пришел. Естественно что посыплются ошибки обращения к несуществующим переменным. Соотв, юзайте просто while и усё будет в ажуре.
     
  10. serj011

    serj011 Активный пользователь

    С нами с:
    18 апр 2010
    Сообщения:
    279
    Симпатии:
    0
    Я понимаю что Попов сатана и чт о Do...while не подходит для работы с бд... ) я пока не умею по другому... можно вообще по существу заданного вопроса!?)
     
  11. k.almas

    k.almas Активный пользователь

    С нами с:
    27 июл 2012
    Сообщения:
    36
    Симпатии:
    0
    По ссылке пройде, спустись ниже там ссылочки на мануал
     
  12. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Вообще, вместо вот этих трёх полей
    bd_day,bd_month,bd_year
    лучше было бы сделать одно поле типа DATE. В MySQL есть встроенные средства для работы с датами. Тем не менее, если уже написан сайт и куча разных скриптов использует именно такой тип хранения даты - то выискивать и переписывать все эти места, наверно, будет влом... Хотя я бы просто добавил в эту таблицу ещё одно поле с датой (последним столбцом) и одним несложным UPDATE-запросом внёс в него данные на основе имеющихся в таблице.

    Могу предложить такой SQL-запрос, который выберет всех юзеров с заданным возрастом (в пример выберет пользователей с возрастом от 25 до 40 лет включительно):
    Код (Text):
    1. SELECT (YEAR(CURDATE()) - YEAR(DATE(CONCAT(`bd_year`, '-', `bd_month`, '-', `bd_day`))) - IF(RIGHT(CURDATE(), 5) < RIGHT(DATE(CONCAT(`bd_year`, '-', `bd_month`, '-', `bd_day`)), 5), 1, 0)) AS `age` FROM `testdates` HAVING `age` >= 25 AND `age` <= 40;
    Естественно, можно добавить в него другие нужные в выборке поля. Но вместо этих извращений с CONCAT() лучше бы всё же хранить в MySQL дату в виде даты, а не просто цифр :)
     
  13. serj011

    serj011 Активный пользователь

    С нами с:
    18 апр 2010
    Сообщения:
    279
    Симпатии:
    0
    sobachnik, не могу разобраться как его совместить с мои м запросом?)
     
  14. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Попробуй так. Не проверял

    $result5 = mysql_query("SELECT anketa.*, foto_user.id_user, activ, users.avatar, bd_day, bd_month, bd_year, visiting_m, visiting_d, visiting_y, visiting_time, nik, city, (YEAR(CURDATE()) - YEAR(DATE(CONCAT(`bd_year`, '-', `bd_month`, '-', `bd_day`))) - IF(RIGHT(CURDATE(), 5) < RIGHT(DATE(CONCAT(`bd_year`, '-', `bd_month`, '-', `bd_day`)), 5), 1, 0)) AS `age` FROM anketa, foto_user, users WHERE users.id = anketa.id_user and ($lf_S) $city_S $albom_foto GROUP BY anketa.id HAVING `age` >= 25 AND `age` <= 40 ORDER BY id DESC LIMIT $start, $num",$db);
     
  15. serj011

    serj011 Активный пользователь

    С нами с:
    18 апр 2010
    Сообщения:
    279
    Симпатии:
    0
    вроде все работает, спасибо большое)