【问题标题】:Combine or Intersect Multiple MySQL Commands组合或交叉多个 MySQL 命令
【发布时间】:2017-01-29 13:04:41
【问题描述】:

我必须搜索两个表。

我的第二张桌子是:

+---------+---------------+-------+
| user_id | is_first_time | score |
+---------+---------------+-------+
|   44    |       1       |   20  |
+---------+---------------+-------+
|   44    |       0       |   20  |
+---------+---------------+-------+

我的第一个表只包含用户信息。

  • 如果我使用下面的 MySQL 命令,我会得到一个结果:

    SELECT * , users_score.user_id users_score_user_id 
    FROM users JOIN users_score 
    ON users_score.user_id = users.id 
    WHERE (users_score.score='20' AND users_score.is_first_time='1')
    
  • 如果我使用下面的 MySQL 命令,我也会得到一个结果(我只是将“is_first_time”的值改为“0”:

    SELECT * , users_score.user_id users_score_user_id 
    FROM users JOIN users_score 
    ON users_score.user_id = users.id 
    WHERE (users_score.score='20' AND users_score.is_first_time='0')
    
  • 但如果我将这两个命令与 AND 结合起来,我将不会得到任何结果:

    SELECT * , users_score.user_id users_score_user_id 
    FROM users JOIN users_score 
    ON users_score.user_id = users.id 
    WHERE (users_score.score='20' AND users_score.is_first_time='1')
    AND (users_score.score='20' AND users_score.is_first_time='0')
    

如何组合或交叉这两个命令?

感谢您的帮助。

【问题讨论】:

    标签: php mysql sql inner-join intersect


    【解决方案1】:

    这里需要使用OR条件

    WHERE (users_score.score='20' AND users_score.is_first_time='1') 
      OR  (users_score.score='20' AND users_score.is_first_time='0')
    

    但可以使用IN条件以更好的方式编写

    SELECT *,
           users_score.user_id users_score_user_id
    FROM   users
           JOIN users_score
             ON users_score.user_id = users.id
    WHERE  users_score.score = '20'
           AND users_score.is_first_time IN ( '1', '0' ) 
    

    【讨论】:

    • 感谢您的回复。 OR 将获得“is_first_time = 1”的行、“is_first_time = 0”的行和“is_first_time = 1 和 0”的行。因此,它不会获得一个用户 ID,而是获得三个。我认为 Gordon Linoff 的回答更正确。还是谢谢。
    【解决方案2】:

    如果您想要两个条件都为真的用户,那么一种方法使用inexists

    SELECT u.* 
    FROM users u
    WHERE u.id IN (SELECT us.user_id FROM users_score us WHERE us.score = '20' AND us.is_first_time = '0'
                  ) AND
          u.id IN (SELECT us.user_id FROM users_score us WHERE us.score = '20' AND us.is_first_time = '1'
                  );
    

    AND 的问题是单行不能同时为 0 和 1。

    如果你只想要用户ID,我推荐group byhaving

    select us.user_id
    from users_score us
    where score = 20 and us.is_first_time in (0, 1)
    group by us.user_id
    having count(distinct us.is_first_time) = 2;
    

    请注意,我删除了单引号。如果列是数字,则不要使用单引号进行比较。 (当然,如果它们是字符串,则使用单引号。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-18
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多