2017-11-18 10 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を書き換える必要がありますか?私は様々な結合を試みましたが、失敗しました。あなたはサブクエリを行うことができます

答えて

0

あなたはサブクエリでINを使用することができます。

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

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

サブクエリが複数の行を返す場合、これは機能しません。 – 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)) 
関連する問題