Форум: "Прочее";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
ВнизПодскажите SQL запрос Найти похожие ветки
← →
d@nger (2010-04-26 12:33) [40]структура таблиц следующая:
таблица call_log
ID - ключ
ORG_ID - ключ организации клиента из таблицы clients.id
CALL_DATE - дата
TEXT - текст
ORG_NAME - текст
в таблице clients много полей... но поле ID точно есть... тоже ключевое...
← →
d@nger (2010-04-26 12:37) [41]вобщем вот в таком виде ошибки нет.. но результат просто выводит все записи...
select c.*, org_name, text from call_log c
left join
(select a.org_id, max(a.call_date) max_date from call_log a
left join clients g on (call_date between "01.04.2010" and "30.04.2010") and a.org_id = g.id
group by a.org_id) b on c.id = b.org_id
← →
test © (2010-04-26 12:42) [42]
select * from call_log c
left join
(select a.org_id, max(a.call_date) max_date from call_log a
left join clients b on ((call_date>="01.04.2010")and(call_date<="30.04.2010")) and a.org_id = b.id
group by a.org_id) b on c.org_id = b.org_id and c.call_date = b.max_date
Я думал что org_id и есть идентификатор, тогда тебе связь нужна по всем полям результирующего набора
← →
test © (2010-04-26 12:47) [43]d@nger (26.04.10 12:37) [41]
Тут ошибка, он по разным полям связь делает, в смысле он делает связь по ключу первой таблицы с ключем второй таблицы.
← →
d@nger (2010-04-26 12:49) [44]
> test © (26.04.10 12:42) [42]
этот запрос тоже выдает просто все записи таблицы
← →
test © (2010-04-26 13:04) [45]d@nger (26.04.10 12:49) [44]
Не может быть чтобы все строки в таблице соответствовали c.org_id = b.org_id and c.call_date = b.max_date
← →
d@nger (2010-04-26 13:12) [46]
> Не может быть чтобы все строки в таблице соответствовали
> c.org_id = b.org_id and c.call_date = b.max_date
возможно это условие как то игнорируется фаербердом
← →
Anatoly Podgoretsky © (2010-04-26 13:14) [47]> d@nger (26.04.2010 12:37:41) [41]
Видимо org_id, call_date и все записи только в интервале "01.04.2010" and "30.04.2010"
← →
d@nger (2010-04-26 13:18) [48]
> идимо org_id, call_date и все записи только в интервале
> "01.04.2010" and "30.04.2010"
ID ORG_ID CALL_DATE TEXT ORG_NAME
97 59 18.03.2010 gregreg Агропромипорт Холдинг
98 59 13.04.2010 ergregerg Агропромипорт Холдинг
99 59 21.04.2010 regergerg Агропромипорт Холдинг
100 59 28.04.2010 erger65ty546 Агропромипорт Холдинг
101 59 20.05.2010 6356356fvgfd Агропромипорт Холдинг
102 59 29.05.2010 ergerger Агропромипорт Холдинг
103 58 14.04.2010 retкуце ецкецкуе Администрация города
104 58 15.04.2010 цукецкуе ку5435 Администрация города
105 58 22.04.2010 е45243525епкупуц Администрация города
в поле TEXT я так просо аброкадабру написал на время разработки
← →
test © (2010-04-26 13:19) [49]d@nger (26.04.10 13:12) [46]
Это правило по которому он связывает, он его игнорировать не может.
Измени
select * from call_log c
На
select c.org_id, b.org_id, c.call_date, b.max_date from call_log c
И посмотри построчно.
← →
Anatoly Podgoretsky © (2010-04-26 13:21) [50]> d@nger (26.04.2010 13:12:46) [46]
Да как он посмел
← →
d@nger (2010-04-26 13:23) [51]вот сейчас выдал вот это :
ORG_ID ORG_ID1 CALL_DATE MAX_DATE
59 18.03.2010
59 13.04.201 0
59 21.04.2010
59 28.04.2010
59 20.05.2010
59 59 29.05.2010 29.05.2010
58 14.04.2010
58 15.04.2010
58 58 22.04.2010 22.04.2010
пустые значения null
← →
d@nger (2010-04-26 13:28) [52]т.е. там где ORG_ID1 не пустое правильные ответы, теперь осталось только отсеять строки где оно равно null
← →
test © (2010-04-26 13:39) [53]d@nger (26.04.10 13:23) [51]
select * from call_log c
right join
(select a.org_id, max(a.call_date) max_date from call_log a
left join clients b on ((call_date>="01.04.2010")and(call_date<="30.04.2010")) and a.org_id = b.id
group by a.org_id) b on c.org_id = b.org_id and c.call_date = b.max_date
Помойму все дело в right join/left join.
← →
d@nger (2010-04-26 15:14) [54]
>
> Помойму все дело в right join/left join.
Ураа! действительно ... все заработало как надо.. спасибо огромное TEST ... намучились же вы со мной.. еще раз спасибо от души!
← →
test © (2010-04-26 15:28) [55]d@nger (26.04.10 15:14) [54]
Пожалуйста. Заодно сам обновил знания SQL.
← →
Кщд © (2010-04-26 17:45) [56]test © (26.04.10 13:39) [53]
call_date>="01.04.2010"
1. нет alias
2. строка вместо даты
3. left join вместо join
4. последнюю запись на дату принято искать по индексу, а не агрегированием
плохие-плохие советы...
← →
test © (2010-04-26 17:47) [57]Кщд © (26.04.10 17:45) [56]
Берешь и сам помогаешь.
← →
d@nger (2010-04-26 19:21) [58]рано что то я обрадовался... взял период за май.. где только одна организация должна выйти, т.к. по второй даты на май нет... все равно две организации выходит... неужели эту на первый взгляд тривиальную задачу так трудно решить?
← →
d@nger (2010-04-26 19:38) [59]попробовал по совету Кщд заменить right join/left join на просто join ... и о чудо все стало работать как надо... еще убрал пару условий не влияющих на результат... итоговый результат следующий:
select c.id, c.org_id, c.call_date, c.org_name, c.text from call_log c
join
(select a.org_id, max(a.call_date) max_date from call_log a
join call_log b on a.call_date between "01.03.2010" and "30.03.2010"
group by a.org_id) d on c.call_date = d.max_date
> 4. последнюю запись на дату принято искать по индексу, а
> не агрегированием
дело в том что дату пользватель вводит самостоятельно, поэтому поиск по ключевому полю не подходит.. или вы имеете ввиду что то другое...
← →
sniknik © (2010-04-26 20:25) [60]> и о чудо все стало работать как надо...
до первых повторов дат
← →
sniknik © (2010-04-26 20:36) [61]вот так попробуй
select org_id, call_date, text, org_name from call_log
where id in (
select max(id) from call_log a
inner join (
select org_id, max(call_date) as call_date from call_log where call_date between "01.05.2010" and "30.05.2010" group by org_id
) b on a.org_id=b.org_id and a.call_date=b.call_date
group by a.org_id) c
не будет зависеть от того
> что id и call_date одновременно возрастают.
главное чтобы id был уникальным. и если в одной группе org_id будет 2 одинаковые даты то возьмется с большим id, хотя это неважно но что то же нужно выбирать.
в твоем запросе ([59]) даже не в диапазоне org_id, а во всем периоде совпадение дат приведет к дублям/"триблям"/"и т.д.блям" ;)
← →
d@nger (2010-04-26 20:46) [62]
> sniknik © (26.04.10 20:36) [61]
>
> вот так попробуй
тоже все работает нормально...
← →
d@nger (2010-04-26 20:48) [63]
> главное чтобы id был уникальным
id ключевое автоинкрементное поле..
← →
sniknik © (2010-04-26 20:49) [64]> тоже все работает нормально...
тогда оставь эту, эта больше учитывает...
вот забей в приведенном примере данных у всех записей одну и туже дату и проверь обе процедуры.
← →
sniknik © (2010-04-26 20:50) [65]> процедуры.
блин, запроса.
← →
d@nger (2010-04-26 21:00) [66]
> вот забей в приведенном примере данных у всех записей одну
> и туже дату и проверь обе процедуры.
да... твоя корректно отработала... предыдущая показала дубли
спасибо sniknik
← →
Кщд © (2010-04-27 07:10) [67]>test © (26.04.10 17:47) [57]
это что, приказ?)
мой пост был Вам, а не автору
если считаете мои советы дурными - не следуйте им)
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.059 c