Вопрос по выборке данных из БД

Всетаки не хотелось бы добавлять новые поля и пересчитывать их каждый день, зачем лишняя нагрузка на БД.

Вы уверены, что понимаете фразу про нагрузку?


Код:
AND STRCMP(date_format(a.date_birthday, '%Y%m%d'), date_format('".DateFromAge($age_min)."', '%Y%m%d')) <= 0
AND STRCMP(date_format(a.date_birthday, '%Y%m%d'), date_format('".DateFromAge($age_max)."', '%Y%m%d')) >= 0
 
какое-то мракобесие у вас с запросом.. непонятно зачем регулярка (это же капец как обузно!) - приведите, пожалуйста, формат поля, с примерами данных.. а лучше полностью схемы таблиц..

ну и даже если с regexp'ом (без которого, скорее всего, можно обойтись), то как-то примерно так:
Код:
SELECT
    DISTINCT a.id,
    a.icon_path,
    e.id_user AS session
FROM pro_user a
    JOIN pro_user_match b ON b.id_user = a.id
    LEFT JOIN pro_active_sessions e
WHERE a.gender IN (2, 3) AND b.gender REGEXP '[[:<:]](2)[[:>:]]'
            AND YEAR( a.date_birthday ) BETWEEN YEAR( NOW() - INTERVAL $age_max YEAR ) AND YEAR( NOW() - INTERVAL $age_min YEAR )
            AND a.id <> '30375'
            AND a.icon_path <> '' AND a.id_country = '23' AND a.id_region = '303' AND a.id_city = '1869007'
            AND a.status='1' AND a.visible='1' AND a.root_user = '0' AND a.guest_user='0'
            ORDER BY a.date_topsearched DESC, a.date_registration DESC;
:


Спасибо, с интересом изучил ваш запрос, только он нерабочим оказался. немножко поправил (добавил ON a.id=e.id_user на 7 строке апроса) и правильный у меня теперь выглядит так:
Код:
              SELECT
                              DISTINCT a.id,
                              a.icon_path,
                              e.id_user AS session
                          FROM pro_user a
                              JOIN pro_user_match b ON b.id_user = a.id
                              LEFT JOIN pro_active_sessions e ON a.id=e.id_user
                          WHERE a.gender IN (1,4) AND b.gender REGEXP '[[:<:]](2)[[:>:]]'
                              AND YEAR( a.date_birthday ) BETWEEN YEAR( NOW() - INTERVAL 40 YEAR ) AND YEAR( NOW() - INTERVAL 20 YEAR )
                              AND a.id <> '30375' and a.icon_path <> '' and a.id_country = '23' and a.id_region = '303' and a.id_city = '1869007'
                              AND a.status='1' AND a.visible='1' AND a.root_user = '0' AND a.guest_user='0'
                              ORDER BY a.date_topsearched DESC, a.date_registration DESC;
Буду ещё тестировать, но на первый взгляд все работает нормально и буду скорее всего использовать этот вариант.
Выходит можно обойтись без функции DateFromAge?
По поводу регулярки, обсуждали тут Для просмотра ссылки Войди или Зарегистрируйся
И как понять "обузно"?) В смысле нагружает mysql сильно?
 
вы бы лучше задачу полностью озвучили, как она на самом деле стоит, да схемы таблиц с примерами заполнения pro_user_match.gender дали.. а то играть в уагадайку действительно будет не точно и мало эффективно..

> Выходит можно обойтись без функции DateFromAge?
имхо она вообще не упёрлась.. всё есть в самом sql..

зы.. что касательно полей а-ля "1,2,5,20", то так вообще никто в здравом уме и трезвой памяти не делает (если, конечно, это не set'ы) - выносят в отдельную таблицу и join'ят вложенный запрос или через exists ограничивают (по задаче и архитектуре смотреть надо).. по ресурсам это будет не сопоставимо легче (да и в целом грамотнее), чем гонять регулярку (которая во всех языках есть зло, хоть порой неизбежное).. это если у вас mysql какой-нибудь (firebird, sqlite, etc).. напр. в postgresql есть нативные поля-массивы..

ззы.. вы правы, второй join я проморгал.. писал прямо тут, навскидку..
 
Назад
Сверху