Объединить или пересечь несколько команд MySQL

Я должен искать на двух таблицах.

Мой второй стол:

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

Как я могу объединить или пересечь обе команды?

Спасибо за любую помощь.

0

Решение

Если вы хотите, чтобы пользователи выполняли оба условия, то один метод использует in или же exists:

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.

Если вы просто хотите идентификатор пользователя, я бы порекомендовал group by а также having:

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;

Обратите внимание, что я удалил одинарные кавычки. Если столбцы являются числами, не используйте одинарные кавычки для сравнения. (Конечно, если они являются строками, используйте одинарные кавычки.)

0

Другие решения

Вам нужно использовать 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' )
1

По вопросам рекламы [email protected]