Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Надо попытаться сделать всё одним запросом! / 15 сообщений из 15, страница 1 из 1
16.09.2003, 04:18
    #32265747
teachxiv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо попытаться сделать всё одним запросом!
Я всегда юзал MSSQL... А вот сейчас нужно сделать один запрос в MySQL-е...

Помогите люди добрые... Я полный дуб в MySQL...

Есть 3 таблицы...

1. таблица а : agent_id, fname, lname (agent_id --> primary key, auto_increment)
2. таблица al : lead_id, agent_id, cstid (lead_id --> primary key, auto_increment)
3. таблица c : cstid, firstname, lastname (cstid --> primary key, auto_increment)

В таблице а хранится информация агентов....
В с - информация lead-ов
а в al всё это связывается...
То есть:

В таблице с храняться записи... Эти записи принадлежат какому-то агенту (связи хранятся в al )... он может передать их другому агенту... во время передачи старая запись не удаляется... а просто добавляется новая запись с той же самой информацией где меняется только поле agent_id... старая запись остаётся нетронутой... но она хоть и имеет в поле agent_id старого хозяина - ему не принадлежит, то есть запись является невалидной... старые записи остаются для истории...

Теперь... вот задача... Надо попытаться вытащить одним запросом (в принципе не обязательно одним... просто нужно логичное, оптимизированное решение) все валидные lead-ы принадлежащие какому-то агенту...

В MSSQL-е это сделалось очень быстро...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT     a.agent_id, a.fname, a.lname, al.lead_id, c.cstid, c.first_name, c.last_name
FROM         agents_leads al LEFT OUTER JOIN
                      customers c ON al.cstid = c.cstid LEFT OUTER JOIN
                      agents a ON al.agent_id = a.agent_id
WHERE     (al.lead_id IN
                          (SELECT     MAX(lead_id) AS mLead_id
                            FROM          agents_leads
                            GROUP BY cstid)) AND (a.agent_id =  3 )


А как сделать что-то подобное в MySQL?

Всё это дело будет использоваться в ColdFusion-е...

Одно решение в принципе есть... но оно плохое...

Делается сначала cfquery и вычисляются все валидные lead_id....
Затем делается второй cfquery где просто подставляются lead_id... что-то наподобие этого:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
<cfquery datasource= "#request.dsn#"  name= "getLeads" >
SELECT     a.agent_id, a.fname, a.lname, al.lead_id, c.cstid, c.first_name, c.last_name
FROM         agents_leads al LEFT OUTER JOIN
                      customers c ON al.cstid = c.cstid LEFT OUTER JOIN
                      agents a ON al.agent_id = a.agent_id
WHERE     (al.lead_id IN (#validLeadsList#)) AND (a.agent_id =  3 )
</cfquery>


где validLeadsList = 1,2,3,45,67,78,89, etc

НО вся проблема в том что validLeadsList может быть оооооочень большим... то есть валидных lead-ов может быть за несколько миллионов... Это смерть ColdFusion-у...

ПАМАГИТЕ!!! Не дайте умереть незнайкой...
ЗЫ... Варианты поменять что-то в логике работы не проходят... К сожалению... Не удалось убедить клиента :-(

ЗЗЫ принимаются к обсуждение любые варианты... Кроме уговора клиента...
...
Рейтинг: 0 / 0
16.09.2003, 10:05
    #32265951
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо попытаться сделать всё одним запросом!
я всегда предлагаю having, а mahoune - временные таблицы.

давайте подождем его ;)
...
Рейтинг: 0 / 0
16.09.2003, 10:27
    #32265993
mahoune
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо попытаться сделать всё одним запросом!
2fedd, в последнее время я в некоторых случаях начал использовать HAVING.
А как тут HAVING вкрячить, я не соображу пока... Помоему проще через TEMPO... ну в общем понятно!
Единственное я с HAVING заметил занятную вещь. Если есть запрос типа:
Код: plaintext
1.
2.
3.
4.
SELECT (@count:=@count+ 1 ) AS MyCount, a.* FROM MyTable a
...
...
HAVING ...


В итоге поле MyCount будет идти не попорядку! (По понятным причинам)

2teachxiv, Делай выводы!

P.S. А что LEFT OUTER JOIN делает и чем от LEFT JOIN отличается?

mahoune
...
Рейтинг: 0 / 0
16.09.2003, 10:39
    #32266019
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо попытаться сделать всё одним запросом!
> P.S. А что LEFT OUTER JOIN делает и чем от LEFT JOIN отличается?

да вроде ничем. лефт и райт - все внешние (outer) объединения, а вот inner - он не бывает ни правым ни левым. типа того
...
Рейтинг: 0 / 0
16.09.2003, 10:42
    #32266023
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо попытаться сделать всё одним запросом!
и вобще, отстал я. у меня ни временных таблиц, ни @count (переменных) не бывает в моей моське, ни триггеров, ни ХП...
...
Рейтинг: 0 / 0
16.09.2003, 14:27
    #32266526
teachxiv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо попытаться сделать всё одним запросом!
2 mahoune

А поподробнее с временными таблицами можно?

Обьясните пожалуйста как первоклашке...

ЗЫ... забыл сказать... сервер под которым это делается - 3.23.49
...
Рейтинг: 0 / 0
16.09.2003, 14:51
    #32266597
mahoune
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо попытаться сделать всё одним запросом!
Берем твой запрос к MSSQL
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT     a.agent_id, a.fname, a.lname, al.lead_id, c.cstid, c.first_name, c.last_name
FROM         agents_leads al LEFT OUTER JOIN
                      customers c ON al.cstid = c.cstid LEFT OUTER JOIN
                      agents a ON al.agent_id = a.agent_id
WHERE     (al.lead_id IN
                          (SELECT     MAX(lead_id) AS mLead_id
                            FROM          agents_leads
                            GROUP BY cstid)) AND (a.agent_id =  3 )

И делаем следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 -- Создаем временную таблицу t1
 
CREATE TEMPORARY TABLE t1 (id INTEGER);

 -- Заполняем ее данными из подзапроса MSSQL
 
INSERT INTO t1
SELECT     MAX(lead_id) AS mLead_id
                            FROM          agents_leads
                            GROUP BY cstid)) AND (a.agent_id =  3 );

 -- Теперь выбираем данные
 
SELECT     a.agent_id, a.fname, a.lname, al.lead_id, c.cstid, c.first_name, c.last_name
FROM         t1, agents_leads al LEFT JOIN
                      customers c ON al.cstid = c.cstid LEFT JOIN
                      agents a ON al.agent_id = a.agent_id
WHERE     t1.id=al.lead_id 

Как то так!
mahoune
...
Рейтинг: 0 / 0
16.09.2003, 15:16
    #32266645
фыфыв
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо попытаться сделать всё одним запросом!
2 mahoune, не по сабжу ...

Скажи, а каким тегом задаётся Font Name при написании сообщений в этом форуме.

ищё раз извиняюсь...
...
Рейтинг: 0 / 0
16.09.2003, 15:26
    #32266669
fedd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо попытаться сделать всё одним запросом!
"font name" никак не задаеться
...
Рейтинг: 0 / 0
16.09.2003, 15:32
    #32266678
фыфыв
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо попытаться сделать всё одним запросом!
А это как было?
я имею ввиду Courier New?
...
Рейтинг: 0 / 0
16.09.2003, 15:34
    #32266685
mahoune
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо попытаться сделать всё одним запросом!
А тут нету font name \r
\r
А так тебе сюда.
...
Рейтинг: 0 / 0
16.09.2003, 15:38
    #32266694
фыфыв
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо попытаться сделать всё одним запросом!
спасибо, конечно, за ссылку, но там про шрифт нету ни слова :((
...
Рейтинг: 0 / 0
16.09.2003, 15:38
    #32266695
mahoune
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо попытаться сделать всё одним запросом!
Еще сюда!\r
\r
mahoune
...
Рейтинг: 0 / 0
16.09.2003, 15:42
    #32266700
фыфыв
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо попытаться сделать всё одним запросом!
Пасиба!!!
...
Рейтинг: 0 / 0
16.09.2003, 20:11
    #32267058
teachxiv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Надо попытаться сделать всё одним запросом!
2 mahoune

Спасибо :-)
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Надо попытаться сделать всё одним запросом! / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]