【问题标题】:SELECT when condition is based on a result of another SELECT当条件基于另一个 SELECT 的结果时选择
【发布时间】:2017-11-18 14:51:54
【问题描述】:

查询 #1 按预期工作,但是“smf_user_points_log.id_school_year”不会每次都是“7”。这个值(而不是 7)必须是查询 #2 的结果。

查询 #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 以获得相同的结果?我尝试了各种联接,但均未成功。

【问题讨论】:

    标签: mysql select inner-join


    【解决方案1】:

    您可以将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))
    

    另外,考虑使用简短且有意义的别名来提高查询的可读性。

    【讨论】:

      【解决方案2】:

      你可以做子查询:

      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))
      

      【讨论】:

      • 如果子查询返回多行,这将不起作用。
      【解决方案3】:

      您可以加入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))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-09
        • 2016-06-24
        • 1970-01-01
        • 1970-01-01
        • 2015-02-15
        • 2015-09-25
        相关资源
        最近更新 更多