Разработка SQL для запросов приоритетной таблицы очереди

Попробуйте это,

, чтобы получить всех пользователей, которые не заплатили за какие-либо месяцы в 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);
6
задан BrianH 21 January 2009 в 15:20
поделиться

7 ответов

Посмотрите, работает ли это:

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)
8
ответ дан 8 December 2019 в 16:12
поделиться

Лучший способ сделать это - зависимый базы данных; это - намного более простая вещь иметь другое извлечение procs для другого целевого DBMSs по сравнению со всеми издержками курсоров или других конструкций.

1
ответ дан 8 December 2019 в 16:12
поделиться

Если Вы хотите, чтобы это было 'параллельным сейфом' на чем-то как 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' задания.

2
ответ дан 8 December 2019 в 16:12
поделиться
select * from queue_manager order by priority_number, timestamp LIMIT 1;

Что касается такого названного "независимого государства базы данных", это - миф для большинства задач реального мира. Как правило, Вы не можете даже создать схему независимым от базы данных способом.

3
ответ дан 8 December 2019 в 16:12
поделиться

Выбор ограниченного количества строк сделан по-другому в различных разновидностях 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 и только иметь фронтэнд, получают первую строку.

1
ответ дан 8 December 2019 в 16:12
поделиться

Считайте этот раздел и выберите вариант, который дает Вам самую подходящую совместимость. Вероятно, использование курсоров является единственным более или менее универсально совместимым путем, но имеет некоторую потерю производительности, которая не могла бы сделать это стоящим того (профиль!).

0
ответ дан 8 December 2019 в 16:12
поделиться

Реляционные базы данных не сильны в руководящих очередях.

Попытайтесь смотреть на MSMQ в мире окон, ActiveMQ в мире Java или Websphere MQ в деловом мире.

Эти продукты делают единственную вещь, управляют очередями, но они делают это хорошо.

0
ответ дан 8 December 2019 в 16:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: