powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Надо попытаться сделать всё одним запросом!
15 сообщений из 15, страница 1 из 1
Надо попытаться сделать всё одним запросом!
    #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
Надо попытаться сделать всё одним запросом!
    #32265951
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я всегда предлагаю having, а mahoune - временные таблицы.

давайте подождем его ;)
...
Рейтинг: 0 / 0
Надо попытаться сделать всё одним запросом!
    #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
Надо попытаться сделать всё одним запросом!
    #32266019
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> P.S. А что LEFT OUTER JOIN делает и чем от LEFT JOIN отличается?

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

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

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

ЗЫ... забыл сказать... сервер под которым это делается - 3.23.49
...
Рейтинг: 0 / 0
Надо попытаться сделать всё одним запросом!
    #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
Надо попытаться сделать всё одним запросом!
    #32266645
фыфыв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 mahoune, не по сабжу ...

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

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

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


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