MySQL выбирает пользователей без карт в статусах A, B и со статусом C - PullRequest
0 голосов
/ 18 октября 2019

Я хочу вернуть пользователей, у которых есть карты в статусе C, НО карт нет в статусах A, B.

Текущий запрос возвращает мне запись, у которой есть C, но у них также есть B! В этом случае я хочу получить ноль.

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 ​​на рельсах:

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

Так что, если у них есть карты в [A, B], а также в C, я не будуне хочу, чтобы пользователь вернулся !!!

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

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'))
0 голосов
/ 18 октября 2019

В предложении WHERE используйте подзапрос, который возвращает user_id s, которые удовлетворяют условиям, которые вы хотите применить:

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
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...