Сравните несколько значений с результатом подзапроса в предложении where - PullRequest
0 голосов
/ 27 марта 2020

У меня есть две связанные таблицы следующим образом:

ПОЛЬЗОВАТЕЛИ

user_id <\ PK>

ИСПОЛЬЗОВАНИЕ

user_action_id <\ PK>

user_id <\ FK>

user_action <\ int>

Всякий раз, когда пользователь выполняет действие, существует новая вставка в таблицу "useractions" Мне нужен запрос для получения тех строк USERACTION, где пользователь выполнил только определенный набор действий, скажем (1,2), но не (3,4). Поэтому у меня есть запрос типа -

select * from USERACTIONS where (1,2) in(select user_action from USERACTIONS where user_id=100) and user_id=100; 

Проблема в том, что приведенный выше запрос не работает, так как supplying (1,2) ожидает, что подзапрос также вернет два столбца, что понятно. Это ошибка, которую я получаю -

ОШИБКА: подзапрос имеет слишком мало столбцов

Предоставление одного значения скажем (1) или (2) работает отлично. Я хочу знать, есть ли способ использовать тот же запрос и сравнить результат подзапроса с несколькими значениями? Я предпочитаю тот же запрос, потому что продемонстрированный здесь случай является лишь частью большого запроса.

Обратите внимание, что в запросе не должны быть перечислены пользователи, которые выполнили (1,2,3,4), должны быть перечислены те, кто выполнил только (1,2), а значения user_action могут быть любым случайным целым числом.

Любые альтернативные запросы приветствуются, но предпочитают изменения в том же запросе. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Это работает для вашего запроса.

Вы добавляете числа к пункту в

SELECT a.user_id
FROM
(SELECT DISTINCT user_id 
from 
 USERACTIONS 
 WHERE user_action 
               IN (1,2)) a 
INNER JOIN
(SELECT DISTINCT user_id 
from 
 USERACTIONS 
 WHERE user_action 
              NOT  IN (1,2)) b 
ON a.user_id <> b.user_id                  
; 
CREATE TABLE USERACTIONS (id INT NOT NULL AUTO_INCREMENT
                            , PRIMARY KEY(id)
                            , user_action INT
                            , user_id INT

                            );

                            INSERT USERACTIONS VALUES (NULL,1,100),(NULL,2,100),(NULL,3,100), (NULL,1,101),(NULL,2,101);
✓

✓
SELECT a.user_id
FROM
(SELECT DISTINCT user_id 
from 
 USERACTIONS 
 WHERE user_action 
               IN (1,2)) a 
INNER JOIN
(SELECT DISTINCT user_id 
from 
 USERACTIONS 
 WHERE user_action 
              NOT  IN (1,2)) b 
ON a.user_id <> b.user_id

; 
| user_id |
| ------: |
|     101 |

дБ <> скрипка здесь

0 голосов
/ 27 марта 2020

попробуйте это:

SELECT USERS.user_id, USERACTIONS.user_action
FROM USERACTIONS
LEFT JOIN USERS ON USERS.user_id = USERACTIONS.user_id  where USERACTIONS.user_action in (1,2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...