Получить записи из таблицы 1, сравнивая с несколькими записями из таблицы 2 - PullRequest
0 голосов
/ 25 октября 2019

У меня есть 2 таблицы (пользователи и использование)

ТАБЛИЦА ПОЛЬЗОВАТЕЛЕЙ

username usage

a        32

b        5

c        5

ТАБЛИЦА ИСПОЛЬЗОВАНИЯ

username usage_added
a        7
b        7
c        7
a        30

Я хочу получить все элементы из таблицы ПОЛЬЗОВАТЕЛЕЙ,которые имеют ИСПОЛЬЗОВАНИЕ БОЛЬШЕ, чем Х (в данном случае, скажем, Х равен 30) И если в USAGES TABLE либо не найдено ни одного ЗАПИСИ с тем же именем пользователя, либо если значение use_added для этого имени пользователя в USAGES TABLE меньше, чем X (в нашем случае 30))

Так что в этом случае он не должен возвращать никаких записей. У меня есть запрос codeigniter

$this->db->select('users.username');
$this->db->from('users');
$this->db->join('usages', 'usages.username = users.username','left');
$this->db->where("(usages.email is NULL OR (usages.usage_added<30 AND usages.username=users.username))", NULL, FALSE);
$this->db->where("users.usage>30", NULL, FALSE);

Используя этот запрос, я все еще получаю "username a". Обычно он не должен возвращать пользователя A, потому что для пользователя a уже добавлена ​​дата 30. Но, похоже, он сравнивается с первой записью (a = 7) и говорит, что <30, и показывает это снова. </p>

Надеюсь, это имеет смысл, и кто-то может помочь.

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Написанный синтаксис SQL Server, этот запрос должен работать для вас:

DECLARE @usage_limit int = 30;

SELECT  A.username
FROM    users as A
        LEFT OUTER JOIN 
        (
            SELECT  username, 
                    usage_added = sum(usage_added)
            FROM    usages 
            GROUP BY 
                    username
        ) as B
            ON A.username = B.username
WHERE   A.usage > @usage_limit
    AND (B.username is null OR B.usage_added < @usage_limit)

Это не возвращает никаких записей. Надеюсь, это поможет!

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

Вы, похоже, описываете логику следующим образом:

select u.*
from users u
where u.usage > 30 or
      not exists (select 1
                  from usages us
                  where us.username = u.username and
                        us.usage > 30
                 );

Вам следует заменить 30 параметром , если он меняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...