Получение максимального номера ревизии из вида не работает, как я думал? - PullRequest
0 голосов
/ 04 мая 2020

Использование MySQL 5.6. У меня есть вид, который берет из одной главной таблицы с именем listquotes, и несколько других предметов из других таблиц. Столбцы импорта в таблице, которые также находятся в представлении: Quote # и Revision. У нас может быть 5 разных ревизий одного и того же номера цитаты, поэтому наша таблица будет выглядеть как

id   ....   Quote#     Revision
================================
1           1234       1
2           1234       2
3           1234       3
4           1234       4
5           1234       5

Теперь в моем приложении GUI есть выпадающий список, который должен позволить вам видеть только самые последние ревизии каждая цитата. Вот как я пытаюсь это сделать

SELECT
...columns...
FROM view_allQuoteInfo
LEFT JOIN listcustomers c ON c.id = view_allQuoteInfo.customerId
WHERE 1=1  AND view_allquoteinfo.customerId = 2453  AND view_allquoteinfo.quoteStatusId = 2 AND view_allquoteinfo.Revision = (SELECT max(t.Revision) FROM view_allquoteinfo t WHERE view_allquoteinfo.`Quote #` = t.`Quote #`)
ORDER BY idx DESC

Однако это не дает мне желаемых результатов. Вот анализ для конкретного клиента c, который я сделал в Excel, некоторые цитаты, которые имеют только одну ревизию, не отображаются, как 6668, в то время как другие, как 4730, у которого есть две ревизии, работают правильно

enter image description here

Предложение where для таблицы All в Excel -

    1=1 
AND view_allquoteinfo.customerId = 2453  
AND view_allquoteinfo.quoteStatusId = 2

, а предложение для последней таблицы -

    1=1  
AND view_allquoteinfo.customerId = 2453  
AND view_allquoteinfo.quoteStatusId = 2 
AND view_allquoteinfo.Revision = 
       (SELECT max(t.Revision) 
          FROM view_allquoteinfo t 
         WHERE view_allquoteinfo.`Quote #` = t.`Quote #`)

, единственное отличие заключается в я пытаюсь получить самую последнюю версию. Логика c выглядит мне правильно, но, очевидно, MySQL интерпретирует это не так, как я думал.

Есть хоть какой-то ключ к пониманию того, почему он не работает или как я могу это исправить?

Я бы ожидал увидеть цитату 6668, редакцию 1 и цитату 5963, редакцию 4, в моей "Последней" таблице, тогда как цитата 5963, редакция 1,2,3 не будет там.

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Я нашел способ, который работает для меня. Когда пользователю нужны все кавычки, я оставляю все как есть.

Когда пользователю нужны только самые последние ревизии, я изменяю свой запрос на выборку, чтобы сказать

SELECT ...., MAX(view_allquoteinfo.Revision) as 'Revision',..., а затем добавляю GROUP BY view_allquoteinfo.'Quote #'.

0 голосов
/ 04 мая 2020

условие WHERE view_allquoteinfo. Quote # = t. Quote # внутри подзапроса неясно (t и view_allquoteinfo - это одна и та же таблица)

поэтому попробуйте использовать объединение в группе подзапросов по кавычке

SELECT
...columns...
FROM view_allQuoteInfo
INNER JOIN (
    SELECT v.`Quote #` my_quote,  max(v.Revision)  max_rev
    FROM view_allquoteinfo v
    GRUP BY v.`Quote #`
) t ON t.my_quote = view_allQuoteInfo.`Quote #`
        AND t.max_rev = view_allQuoteInfo.Revision
LEFT JOIN listcustomers c ON c.id = view_allQuoteInfo.customerId
WHERE view_allquoteinfo.customerId = 2453  
AND view_allquoteinfo.quoteStatusId = 2 
ORDER BY idx DESC
...