Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите разобраться с LEFT JOIN 
:(
    Опции темы
Gugle
Дата 30.4.2008, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 9.12.2005

Репутация: нет
Всего: нет



Доброго времени суток!
Помогите разобраться с конструкцией LEFT JOIN в MySQL запросах.

Опишу сначало задание.

1.Из таблиц notice, geo и adm_info показать только те записи в которых имеются совпадения по ключам notice.ntc_id=geo.ntc_id и notice.adm=adm_info.adm.

2.Но при этом не показывать те ntc_id для которых не выполняется условие в таблице freq.max>20 и freq.min<10.

Связь notice.ntc_id осуществляется след образом:

Полученные значения notice.ntc_id сравниваем со значениями s_beam.ntc_id и достаем достаем s_beam.beam_name и s_beam.emi_rcp.
Полученные 3 значения сравниваем со след таблицей grp.ntc_id=ntc_id AND grp.s_beam=s_beam AND grp.emi_rcp и достаем следующее поле - grp.grp_id.
Теперь полученные 4 значения надо сравнить с таблицей freq и вытащить все значения freq.min и freq.max, а потом сравнить их с диаппазоном от 10 до 20.

Я решаю данную задачу с помощью "временных" таблиц, но вроде как с помощью LEFT JOIN она должна решаться быстрее, а вот как сделать этот запрос не могу понять.

Вот мой запрос:
Код

SELECT frt3.ntc_id, frt3.adm 
FROM (
 SELECT frt2.ntc_id, frt2.adm, frt2.beam_name, frt2.emi_rcp, grp.grp_id 
 FROM (
  SELECT notice.ntc_id, notice.adm  
  FROM notice, geo, adm_info 
  WHERE (notice.ntc_id=geo.ntc_id AND notice.adm=adm_info.adm)
 ) AS frt1, s_beam 
 WHERE (s_beam.ntc_id=frt1.ntc_id)
) AS frt2, grp 
WHERE (grp.ntc_id=frt2.ntc_id AND grp.beam_name=frt2.beam_name AND grp.emi_rcp=frt2.emi_rcp)
) AS frt3, freq 
WHERE (freq.ntc_id=frt3.ntc_id AND freq.beam_name=frt3.beam_name AND freq.emi_rcp=frt3.emi_rcp AND freq.grp_id=frt3.grp_id AND
freq.freq_max>'20' AND freq.freq_min<'10') GROUP BY ntc_id


Теперь сами таблици:

Код

notice        |   | geo      |   |adm_info|
--------------|   |----------|   |--------|
ntc_id (k)|adm|   |ntc_id (k)|   | adm    |
 1        | R |   |  2       |   | R      |
 2        | R |   |  4       |   | D      |
 3        | J |   |  6       |   | H      |
 4        | G |   |  8       |   | G      |

|------------------------------------|   |-----------------------------------|   |---------------------------------------------|
|              s_beam                |   |                grp                |   |                    freq                     |
|------------------------------------|   |-----------------------------------|   |---------------------------------------------|
|ntc_id (k)|beam_name (k)|emi_rcp (k)|   |ntc_id|beam_name|emi_rcp|grp_id (k)|   |ntc_id|beam_name|emi_rcp|grp_id (k)|min |max |
| 1        | A           | E         |   | 1    | A       | E     | 5        |   | 1    | A       | E     | 5        | 11 | 19 | 
| 2        | B           | E         |   | 1    | A       | E     | 6        |   | 1    | D       | R     | 7        | 55 | 60 |
| 3        | C           | R         |   | 3    | D       | E     | 7        |   | 1    | C       | R     | 8        | 30 | 40 |
| 4        | D           | R         |   | 4    | D       | R     | 8        |   | 2    | F       | R     | 9        | 21 | 22 |


По первому пункту должно вывести:
1 R
2 R
4 G

А если ввести второй параметр то останется только одна запись:
1 R

Помогите разобраться как составить этот запрос с помощью LEFT JOIN.

Заранее благодарен!
PM MAIL   Вверх
Magnifico
Дата 30.4.2008, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 4
Всего: 17



это ж надо создать все твои таблицы  ,заполнить, подумать
скриты готовые давай!!!


--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
Gugle
Дата 30.4.2008, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 9.12.2005

Репутация: нет
Всего: нет



Эээ.. У меня готовые таблици.

попробую по другому задать пример.
А можно какой нить простой примерчик как от структуры:

Код

SELECT odin.name1, odin.name2
FROM (
   SELECT table11.name1, table11.name2
   FROM table11, table12
   WHERE table11.name1=table12.name2
) AS odin, table21
WHERE table21.name1=odin.name1

перейти к left join.
PM MAIL   Вверх
Magnifico
Дата 30.4.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 4
Всего: 17



Код

SELECT odin.name1, odin.name2

FROM (
   SELECT  t1.name1,  t1.name2
   FROM  table11 as  t1,  table12  as t2
   WHERE  t1.name1 =  t2.name2
) AS odin ,  table21  as  t3

WHERE  t3.name1 = odin.name1



Код

SELECT  t1.name1, t1.name2   --, t2.*,t3.*
FROM  table11  as  t1
left join table12  as t2
on t1.name1 = t2.name2
left join  table21  as  t3
on t3.name1 = t1.name1 
where t2.name1 is not null and t3.name1 is not null      --  фильр для одинакового результата 1 и 2 запроса 




--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
Gugle
Дата 4.5.2008, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 9.12.2005

Репутация: нет
Всего: нет



Спасибки.
Буду ковырять. Пока сниму вопрос с обсуждения.

Добавлено через 9 минут и 25 секунд
Из "Справочное руководство по MySQL"
Цитата

Выражение "A LEFT JOIN B" в MySQL реализовано следующим образом:
* Если в таблице A имеется строка, соответствующая выражению WHERE, но в таблице B ни одна строка не удовлетворяет условию LEFT JOIN, генерируется дополнительная строка B, в которой все значения столбцов устанавливаются в NULL.


Как это?
PM MAIL   Вверх
Gugle
Дата 4.5.2008, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 9.12.2005

Репутация: нет
Всего: нет



Ээээ...
Из примера от Magnifico, по поводу фильтра.
Если mysql не находит совпадений значения t1.name1 в таблице t2.name2 он создает это значение с null параметром?!?

И соответственно это ответ на мой предидущий вопрос. Но веть если у мя больше таблиц их отсеивать придется. Чет тогда не понимаю зачем нужен left join если он доп строки генерит. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.1242 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.