Попробуйте это,
, чтобы получить всех пользователей, которые не заплатили за какие-либо месяцы в 2018 году.
SELECT * FROM `user` u left join payments p on u.usid = p.usid where usid not in (select usid from payments where `year` = 2018);
ИЛИ
SELECT * FROM `user` where usid not in (select usid from payments where `year` = 2018);
Посмотрите, работает ли это:
select * from queue_manager where priority_number =
(select min(priority_number) from queue_manager) and
timestamp = (select min(timestamp)
from queue_manager qm2
where qm2.priority_number = queue_manager.priority_number)
Лучший способ сделать это - зависимый базы данных; это - намного более простая вещь иметь другое извлечение procs для другого целевого DBMSs по сравнению со всеми издержками курсоров или других конструкций.
Если Вы хотите, чтобы это было 'параллельным сейфом' на чем-то как InnoDB, сделайте:
1) Добавьте 'in_progress' поле.
2) Выключите автоматическую фиксацию
3) ВЫБЕРИТЕ * ИЗ queue_manager, где in_progress = 0 порядков priority_number, метка времени ОГРАНИЧИВАЕТ 1 ДЛЯ UDPATE;
4) ОБНОВИТЕ in_progress НАБОРА queue_manager = 1 где идентификатор = X;
5) ФИКСАЦИЯ
6) Сделайте задание. Затем удалите строку когда ее сделанный к удовлетворенности. Имейте 'основной процесс', обрабатывают/повторно делегируют/очищают старые 'in_progress' задания.
select * from queue_manager order by priority_number, timestamp LIMIT 1;
Что касается такого названного "независимого государства базы данных", это - миф для большинства задач реального мира. Как правило, Вы не можете даже создать схему независимым от базы данных способом.
Выбор ограниченного количества строк сделан по-другому в различных разновидностях SQL, таким образом, в зависимости от которого Вы используете, мог бы быть созданный способом сделать это. Например, в SQL Server MS:
SELECT TOP 1
identifier,
priority_number,
timestamp,
description
FROM
dbo.Queue_Manager
ORDER BY
priority_number,
timestamp
Чтобы сделать это в ANSI совместимый SQL, следующие методы должны работать:
SELECT
QM1.identifier,
QM1.priority_number,
QM1.timestamp,
QM1.description
FROM
Queue_Manager QM1
LEFT OUTER JOIN Queue_Manager QM2 ON
QM2.priority_number < QM1.priority_number OR
(QM2.priority_number = QM1.priority_number AND QM2.timestamp < QM1.timestamp)
/* If you're concerned that there might be an exact match by priority_number
and timestamp then you might want to add a bit more to the join */
WHERE
QM2.identifier IS NULL
Или можно попробовать:
SELECT
QM1.identifier,
QM1.priority_number,
QM1.timestamp,
QM1.description
FROM
Queue_Manager QM1
INNER JOIN
(
SELECT
priority_number
MIN(timestamp) AS timestamp,
FROM
Queue_Manager
WHERE
priority_number =
(
SELECT
MIN(priority_number)
FROM
Queue_Manager
)
GROUP BY
priority_number
) SQ1 ON
SQ1.priority_number = QM1.priority_number AND
SQ1.timestamp = QM1.timestamp
Никакой метод не составляет точные совпадения и в priority_number и в метке времени, поэтому если Вы будете думать, что это возможно (и возможно даже если Вы не сделаете), то необходимо будет добавить строку или два для движения еще одного уровня с помощью идентификатора или чего-то еще, что гарантирует уникальность. Или просто запишите, Ваш фронтэнд для обработки случайного случая возвращения двух строк (возможно, просто игнорируют второе - Вы получите его в следующий раз через).
Протестируйте каждый метод и посмотрите который работы лучше для Вас.
Кроме того, как большой Вы ожидаете, что очередь доберется? Могло быть разумно просто запросить с Вашим ORDER BY и только иметь фронтэнд, получают первую строку.
Считайте этот раздел и выберите вариант, который дает Вам самую подходящую совместимость. Вероятно, использование курсоров является единственным более или менее универсально совместимым путем, но имеет некоторую потерю производительности, которая не могла бы сделать это стоящим того (профиль!).
Реляционные базы данных не сильны в руководящих очередях.
Попытайтесь смотреть на MSMQ в мире окон, ActiveMQ в мире Java или Websphere MQ в деловом мире.
Эти продукты делают единственную вещь, управляют очередями, но они делают это хорошо.