2017-11-18 8 views
0

쿼리 # 1은 의도 한대로 작동하지만 "smf_user_points_log.id_school_year"는 매번 "7"이되지 않습니다. 이 값 (7 대신)은 쿼리 # 2의 결과 여야합니다.조건이 다른 SELECT의 결과를 기반으로하는 경우 SELECT

쿼리 # 1 :

SELECT smf_user_points_log.id_member, smf_members.usertitle 
     FROM smf_user_points_log 
     INNER JOIN smf_members 
     ON smf_members.id_member=smf_user_points_log.id_member 
     WHERE smf_user_points_log.id_school_year = 7 AND smf_user_points_log.points >= 50 AND smf_members.date_registered < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY)) 

쿼리 # 2 :

SELECT id_school_year FROM smf_settings 

가 어떻게 같은 결과를 얻기 위해 쿼리 # 1을 다시 작성해야합니까? 여러 가지 조인을 시도했지만 실패했습니다. 당신은 하위 쿼리와 IN을 사용할 수 있습니다

SELECT smf_user_points_log.id_member, smf_members.usertitle 
    FROM smf_user_points_log 
    INNER JOIN smf_members 
    ON smf_members.id_member=smf_user_points_log.id_member 
    WHERE smf_user_points_log.id_school_year = (SELECT id_school_year FROM smf_settings) AND smf_user_points_log.points >= 50 AND smf_members.date_registered < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY)) 

답변

0

: 또한,

SELECT l.id_member, 
    m.usertitle 
FROM smf_user_points_log l 
INNER JOIN smf_members m 
    ON m.id_member=l.id_member 
WHERE l.id_school_year in (SELECT id_school_year FROM smf_settings) 
    AND l.points >= 50 
    AND m.date_registered < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY)) 

를 쿼리 가독성을 향상시키기 위해 짧고 의미있는 별칭을 사용하는 것을 고려

0

당신은 하위 쿼리를 할 수 있습니다.

+0

하위 쿼리가 여러 행을 반환하는 경우에는 작동하지 않습니다. – Barmar

0

smf_settings 테이블에 가입 할 수 있습니다.

SELECT smf_user_points_log.id_member, smf_members.usertitle 
FROM smf_user_points_log 
INNER JOIN smf_members 
    ON smf_members.id_member=smf_user_points_log.id_member 
INNER JOIN smf_settings 
    ON smf_user_points_logs.id_school_year = smf_settings.id_school_year 
WHERE smf_user_points_log.points >= 50 
    AND smf_members.date_registered < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY))