Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2011, 22:15   #1
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию Псевдоним для результата left join

Доброго времени суток, участникам славного форума))

Товарищи, нигде в сети не могу найти пример назначения псевдонима для результата join left в MySQL - видел только для postgreSQL ....

одним словом вот я составил такой вот шаблонный запрос =
(представим, что все таблицв и поля существуют)
Код:
SELECT  NAME FROM (TAB1 LEFT JOIN TAB2 on  TAB1.ID = TAB2.ID) as NEWTAB WHERE NEWTAB.NUMBER= TAB3.NAMBER;
подскажите пожалуйста - что и где здесь неправильно?

Заранее благодарю))
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 25.12.2011, 22:53   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
SELECT  NAME 
  FROM TAB3,(TAB1 LEFT JOIN TAB2 on  TAB1.ID = TAB2.ID)
  WHERE NEWTAB.NUMBER= TAB3.NAMBER;
TAB3 потеряли наверно
Псевдоним для конструкции TAB1 LEFT JOIN TAB2 on TAB1.ID = TAB2.ID и не нужен
Вместо NEWTAB.NUMBER скорее всего TAB2.NUMBER или TAB1.NUMBER (куда NUMBER входит?)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.12.2011, 23:17   #3
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

Аватар , не потерял... просто видать у меня конкретный косяк с логикой -
я хотел выразить этим запросом следующее -

получить имена с результирующей таблицы , полученной из двух с помощью LEFT JOIN + добавить + условие которое неким образом работает с полями опять же этой вот таблицы (NEWTABLE) - что я сделал неправильно?
Можно ли вообще назначать подобным образом псевдоним - судя по phpmyadmin - нельзя...
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 25.12.2011, 23:25   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вы представляйте следующее: по LEFT JOIN к каждой выбранной записи Tab1 цепляется от 0 до N записей из Tab2 по условию в ON. Во WHERE задаете условие на Tab1, возможно еще и дополнительно на Tab2. А лучше покажите здесь структуру и что нужно получить внятно распишите
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.12.2011, 23:41   #5
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

ок. -
1) (чтобы не тратить зря время ваше) мне выходит нужен подзапрос после left join
- если это возможно , то =
2) задача такая - получить список фильмов , который записаны на CD, которые взяли в прокат но , не отдали -
всего 4-ре таблицы =
Код:
create table Film
(id_filma VARCHAR(200),
 Nazvanie VARCHAR(200),
 Zhanr VARCHAR(200),
 Rezhiser VARCHAR(200),
 Spisok_aktorov VARCHAR(2000));
 
 
create table Entity
(id_id_filma VARCHAR(200) Not Null REFERENCES Film(id_filma),
 id_id_nositelya VARCHAR(200) NOT NULL REFERENCES Nositel(id_nositelya), tsena_za_sutku varchar(20) Not Null,
 summa_zaloga VARCHAR(200) Not Null);
 
 
create table Vidacha
(id_nositelya VARCHAR(200) Not Null,
Data_vidachi date Not Null,
Familya VARCHAR(200) Not Null,
Imya VARCHAR(200) Not Null,
Otchestvo VARCHAR(200) Not Null,primary key (id_nositelya),
Data_vozvrata date);
 
 
create table Nositel
 (id_nositelya VARCHAR(200),
 id_filma VARCHAR(200),
 tip_nositelya VARCHAR(200),
 primary key (id_nositelya));
"логика" моего решения такова -
Цитата:
для выданного фильма , который ещё не вернули будет присутствовать только дата выдачи, а даты возврата не будет
а если перевести в sql =
Код:
select nazvanie from ( film left join nositel on film.id_filma=nositel.id_filma) as NEWTABLE where
 ("CD" = select nositel.tip_nositelya from nositel where nositel.id nositelya =  NEWTABLE.id_nositelya)
and
(exists (select vidacha.id_nositelya  from vidacha where (vidacha.id_nositelya = NEWTABLE.id_nositelya )
 and (vidacha.data_vozvrata is NULL) );
вроде самое нужное привёл. подробнее здесь.

такие вот дела(
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 25.12.2011, 23:50   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Стоит так попробовать, приспособив под MySQL
Код:
SELECT Film.*
  FROM Film,Nositel,Vidacha
  WHERE Film.id_filma=Nositel.id_filma AND Nositel.tip_nositelya='CD' AND
        Nositel.id_nositelya=Vidacha.id_nositelya AND Vidacha.Data_vozvrata IS NULL
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.12.2011, 00:14   #7
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

ммм....запятая - это же когда прямое произведение множеств.....но (насколько я понимаю) решение вполне оптимально , да ведь ?

а в чём мой предыдущий запрос не соответствует MysQL? а то база всё одну ошибка клеит - типа "проверьте " синтаксис....или слишком уж много чем?
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 26.12.2011, 00:23   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если уж есть желание такие конструкции использовать
Код:
select nazvanie from ( film left join nositel on film.id_filma=nositel.id_filma) as NEWTABLE ...
то примерно так
Код:
select nazvanie from (SELECT <список полей> FROM film left join nositel on film.id_filma=nositel.id_filma WHERE ...) as NEWTABLE ...
Тогда вложенный запрос и будет играть роль какой-то таблицы (вернее псевдо-таблицы или точнее - выборки из таблиц)
Цитата:
решение вполне оптимально , да ведь
Дык попробуйте
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 26.12.2011 в 00:28.
Аватар вне форума Ответить с цитированием
Старый 26.12.2011, 00:28   #9
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

Цитата:
select nazvanie from (SELECT <список полей> FROM film left join nositel on film.id_filma=nositel.id_filma) as NEWTABLE ...
Аватар , вас понял))) спасибо!) как и предполагалось - проблемы с пониманием логики)
спасибо вам)))
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
IE8. не работает padding-left, margine-left dimonnnn HTML и CSS 7 13.08.2010 19:33
left join странная ошибка pobedin БД в Delphi 6 24.06.2010 13:48
LEFT JOIN acidcool SQL, базы данных 12 20.08.2009 19:23
Указать Left и Top для формы Dr.Badnezz Общие вопросы Delphi 4 09.11.2008 15:49
Алиас (псевдоним) для бд FOXPRO IGREK БД в Delphi 0 01.07.2008 00:58