|
Как сделать выборку c JOIN-ом последних записей из лога по каждому из идентификаторов?
|
|||
---|---|---|---|
#18+
Превед! Есть таблицы: таб. Docs (Документы), поля: DocID - ид записи в таблице DocTypeID - ид типа дока ... и тд таб. DocsTypes (виды документов), поля: DocTypeID - ид записи в таблице DocTypeName - наименование типа документа ... таб. DocsStates (разновидности состояний документов), поля: DocStateID - ид записи в таблице DocStateName - наименование состояния ... таб. DocsStatesLog (журнал состояний документов), поля: RecID - ид записи в таблице DocID - ид документа из таблицы Docs DocStateID - ид состояния документа из DocsStates DocStateDate - дата присвоения состояния ... Поскольку в DocsStatesLog каждый раз при получении нового состояния вносится запись, то на один DocID может приходиться несколько записей об изменении состояния документа. И если я сделаю такую выборку Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
спасибо. вфп9 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2009, 11:15 |
|
Как сделать выборку c JOIN-ом последних записей из лога по каждому из идентификаторов?
|
|||
---|---|---|---|
#18+
СТАС-КО, попробуйте навесить агрегатные ф-ции на подчиненные таблы. Ну или условия добавьте- для этих джойнов чтоб записи брались с наибольшими ID- шниками. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2009, 12:40 |
|
Как сделать выборку c JOIN-ом последних записей из лога по каждому из идентификаторов?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2009, 21:33 |
|
Как сделать выборку c JOIN-ом последних записей из лога по каждому из идентификаторов?
|
|||
---|---|---|---|
#18+
ВладимирМ Выбрать из дочерней таблицы записи с максимальной датой оба Ваши варианта (3й, экзотический - не пробовал) почему-то зацикливают mysql - он хавает 99% ресурсов сервера и не дает результата вообще... впрочем точно так же как и в моем примере, который я зачислил в неверные из-за того же зависания (по этой же причине собственно и задал свой вопрос): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2009, 23:40 |
|
Как сделать выборку c JOIN-ом последних записей из лога по каждому из идентификаторов?
|
|||
---|---|---|---|
#18+
Mysql с подзапросами ваще как-то странно работает, особенно после того как избалует фокс - поэтому в таких случаях делю запрос не несколько - тогда работает быстро. А так он именно грузит сервер по самое "не балуй" ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2009, 00:20 |
|
Как сделать выборку c JOIN-ом последних записей из лога по каждому из идентификаторов?
|
|||
---|---|---|---|
#18+
CTAC-KO таб. DocsStatesLog (журнал состояний документов), поля: DocStateDate - дата присвоения состояния как сделать выборку чтобы в нее попало бы только текущее состояние каждого документа, т.е. последнее присвоенное и только? День добрый! Если критерий последнего- дата присвоения состояния, то можно попробовать что-то вроде этого: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Код: plaintext 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2009, 11:16 |
|
Как сделать выборку c JOIN-ом последних записей из лога по каждому из идентификаторов?
|
|||
---|---|---|---|
#18+
В случае Top-a уточнение: [src]SELECT d.DocID,a.DocTypeName,b.DocStateID,b.DocStateDate,c.DocStateName; FROM Docs d; LEFT JOIN DocsTypes a ON a.DocTypeID = d.DocTypeID ; LEFT JOIN DocsStatesLog b ON b.DocID = d.DocID; LEFT JOIN DocsStates c ON c.DocStateID = b.DocStateID; where b.DocStateDate=(select top 1 DocStateDate from DocsStatesLog where DocID=d.DocID order by DocStateDate desc); or b.DocStateDate is null ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2009, 11:18 |
|
Как сделать выборку c JOIN-ом последних записей из лога по каждому из идентификаторов?
|
|||
---|---|---|---|
#18+
2Tohan_ORA - Ваш пример тоже "опустил" мускул - безрезультатный висняк... А select top 1 там ваще не канает. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2009, 19:06 |
|
Как сделать выборку c JOIN-ом последних записей из лога по каждому из идентификаторов?
|
|||
---|---|---|---|
#18+
Что же вы все так MAX() любите? Там же другой вариант показан Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Все дело в подзапросе по NOT EXISTS(), который отсекает записи лога с тем же номером документа, но с датой меньше, чем у текущей записи. Второй подзапрос с условием по RecId нужно только в том случае, если в логе могут быть записи с одинаковым значением даты для одного документа. При этом я предполагаю, что записи лога созданные "позднее" имеют бОльшее значение RecId. Если это не так, то нужны дополнительные критерии по которым можно выбрать запись лога, если статус у документа может меняться несколько раз в течении дня. Да и LEFT особого смысла не имеет. Поскольку он предполагает, что есть документы без статуса. Если такое возможно и их тоже надо отобрать, то, конечно, LEFT нужен. В противном случае, лишние проблемы серверу. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2009, 20:34 |
|
Как сделать выборку c JOIN-ом последних записей из лога по каждому из идентификаторов?
|
|||
---|---|---|---|
#18+
2 Владимир Максимов: я же уже Вам отвечал, что оба Ваших примера (из Вашей же статьи по ссылке) - не работают на mysql, т.е. завешивают последний. Моя вина в том что не указал сразу что речь идет о запросе на мускул, просто посчитал что язык SQL для обоих "платформ" одинаков... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2009, 01:12 |
|
Как сделать выборку c JOIN-ом последних записей из лога по каждому из идентификаторов?
|
|||
---|---|---|---|
#18+
Такая конструкция на MySQL прокатит? Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2009, 09:30 |
|
Как сделать выборку c JOIN-ом последних записей из лога по каждому из идентификаторов?
|
|||
---|---|---|---|
#18+
CTAC-KOпросто посчитал что язык SQL для обоих "платформ" одинаков...И были для этого хоть какие-то основания? В каждой системе своя реализация SQL. Запомните это как аксиому. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2009, 10:23 |
|
Как сделать выборку c JOIN-ом последних записей из лога по каждому из идентификаторов?
|
|||
---|---|---|---|
#18+
CTAC-KO2 Владимир Максимов: я же уже Вам отвечал, что оба Ваших примера (из Вашей же статьи по ссылке) - не работают на mysql, т.е. завешивают последний. Моя вина в том что не указал сразу что речь идет о запросе на мускул, просто посчитал что язык SQL для обоих "платформ" одинаков... Не обязательно "завешивают". Просто подобные запросы не оптимизируются. По крайней мере, в FoxPro. Как следствие, если объем таблиц достаточно большой, то время выполнения может быть катострафически большим. Ведь необходимо "тупо" просканировать ВСЕ записи таблицы логов. А это очень много. Вот и возникает ощущение "завешивания". Для начала, попробуйте убрать "вспомогательные" таблицы. Оставить в запросе только Docs и DocsStatesLog. В принципе, есть разные приемы, как ускорить выполнение запроса, но все они сводятся к уменьшению объема выборки путем разных "махинаций", очень существенно зависящих от конкретной постановки задачи. Т.е. что именно происходит с полученной выборкой? Для чего она нужна? Можно ли часть информации выбирать "по требованию"? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2009, 11:32 |
|
Как сделать выборку c JOIN-ом последних записей из лога по каждому из идентификаторов?
|
|||
---|---|---|---|
#18+
CTAC-KO, Если есть возможность создать функцию на сервере,то можно её использовать в запросе,например для Oracle ,будет так(для MySql -может что либо подобное): Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2009, 13:19 |
|
Как сделать выборку c JOIN-ом последних записей из лога по каждому из идентификаторов?
|
|||
---|---|---|---|
#18+
2 Владимир Максимов: дело в том, что я пробовал указать вместо DocID реальное значение одного из документов, у которого в журнале было всего 3 записи по смене состояний (всего в логе 40к записей). один фиг - зависание. 2 Tohan_ORA - да, создать процедуры и функции можно, но мне это будет стоить времени, т.к. я не разбирался еще толком что да как. Возможно попробую когда-то в дальнейшем. Пока же интересен вариант выборки. Вот piva пишет что это проблема мускула и я думаю что так оно и есть... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2009, 19:14 |
|
Как сделать выборку c JOIN-ом последних записей из лога по каждому из идентификаторов?
|
|||
---|---|---|---|
#18+
GoshaSТакая конструкция на MySQL прокатит? Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2009, 19:17 |
|
Как сделать выборку c JOIN-ом последних записей из лога по каждому из идентификаторов?
|
|||
---|---|---|---|
#18+
2 Владимир Максимов: Ваш пример таки работает, если задать DocID. Это мой, с МАХ() даже с указанным DocID зависал вроде, не помню точно. Просто попробовал еще раз. Значит он работает и в целом, но очень долго если для всей таблицы документов... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2009, 19:32 |
|
Как сделать выборку c JOIN-ом последних записей из лога по каждому из идентификаторов?
|
|||
---|---|---|---|
#18+
индексация по DocID в таблице DocsStatesLog уменьшило время выборки с 764 до 0,6 секунд... Чето я сразу не допер что в этом может быть дело. Интересно что дополнительный индекс там же по дате ничего не дает - видимо потому что на один DocID приходится немного записей ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2009, 19:53 |
|
|
start [/forum/topic.php?fid=41&msg=35984013&tid=1586461]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 333ms |
total: | 470ms |
0 / 0 |