【问题标题】:mysql select users without cards in statuses A, B AND with status Cmysql在状态A,B和状态C中选择没有卡的用户
【发布时间】:2020-02-14 20:26:13
【问题描述】:

我想退回状态为 C 但没有状态为 A、B 的卡的用户。

当前查询返回我记录谁有 C 但他们也有 B!在这种情况下,我想获得 null。

SELECT u.*,
   b.id AS categories, 
   c.id AS cards
FROM users AS u
       JOIN categories AS b ON u.id = b.user_id      
       JOIN cards AS gac ON u.id = c.user_id
WHERE b.type = 'whatever' AND
      c.status NOT IN ('A', 'B') AND c.status = 'C';

在 ruby​​ on rails 中:

users = User.includes(categories: :cards).where(categories: {type: :whatever}).where.not(cards: {status: ['A', 'B']}).where(cards: {status: 'C'})

所以如果他们在 [A, B] 和 C 中都有卡,我不想让用户返回!!!

【问题讨论】:

  • 问题是,一条记录可以同时具有两种状态吗?我不太清楚这个问题
  • c.status NOT IN ('A', 'B') AND c.status = 'C' 奇怪的情况
  • 不,每张卡只有一个状态@YuriiVerbytskyi

标签: mysql sql ruby ruby-on-rails-5


【解决方案1】:

在 WHERE 子句中使用子查询,它返回满足您要应用的条件的user_ids:

SELECT u.*,
   b.id AS categories, 
   c.id AS cards
FROM users AS u
JOIN categories AS b ON u.id = b.user_id      
JOIN cards AS c ON u.id = c.user_id
WHERE b.type = 'whatever'
AND u.id IN (
  SELECT user_id
  FROM cards 
  GROUP BY user_id
  HAVING SUM(status IN ('A', 'B')) = 0 AND SUM(status = 'C') > 0
)

【讨论】:

  • 你能在 RoR 中也写这个吗?
  • 我无法帮助您使用 Ruby,只能使用 SQL。
【解决方案2】:

WHERE 条件应用于每一行,而不是集合。因此,您当前的条件只是过滤掉没有c.status = 'C' 的行。

您要做的是识别具有status = 'C' 行的用户,然后过滤掉也具有status IN ('A','B') 记录的用户。一种方法是使用子查询:

WHERE c.status = 'C'
AND c.user_id NOT IN (SELECT user_id FROM cards WHERE status IN ('A',B'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    相关资源
    最近更新 更多