Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Господа, будьте снисходительны, не бросайтесь сразу штрафовать за, как вам кажется, глупые вопросы - beginners на то и beginners.
 |
а кто-то может обяснить, как так получается в квери: 26.02.04 17:54 Число просмотров: 1172
Автор: tdes@work Статус: Незарегистрированный пользователь
|
а кто-то может обяснить, как так получается в квери:
SELECT ProjectInvoices.*, Invoices.InvoiceID, Contracts.ContractID, Clients.ProjectID AS CPid
FROM ProjectInvoices LEFT JOIN (Invoices
INNER JOIN Contracts USING(ContractID)
INNER JOIN Clients ON (Clients.ClientID = Contracts.ClientID AND Clients.ProjectID = 3) )
ON (Invoices.TypeID = ProjectInvoices.Type )
WHERE ProjectInvoices.ProjectID = 3
GROUP By ProjectInvoices.Type
ORDER BY ProjectInvoices.Type
---
InvoiceID не NULL, хотя выделенная болдом часть не содержит ни одного ряда ?
|
<beginners>
|
MySQL - op JOIN 26.02.04 16:30 [whiletrue]
Автор: tdes@work Статус: Незарегистрированный пользователь
|
предположим следующую иерархию в db:
Bills
|
Contracts
/ \
Clients Products
---
Bills & Contracts связанны по индексу ContractID
Contracts & Clients связанны по индексу ClientID
Contracts & Products связанны по индексу ProductID
нужно связать JOIN все 4 таблицы.
правильно ли:
Bills INNER JOIN ( Clients INNER JOIN Contracts USING(ClientID) INNER JOIN Products USING(ProductID) ) ON Bills.ContractID = Contracts.ContractID
???
вроде работает, но есть сомнения
10x
|
 |
У меня вопросик есть 27.02.04 11:38
Автор: whiletrue <Роман> Статус: Elderman
|
> предположим следующую иерархию в db: > > Bills
> |
> Contracts
> / \
> Clients Products
> ---
> Bills & Contracts связанны по индексу ContractID > Contracts & Clients связанны по индексу ClientID > Contracts & Products связанны по индексу ProductID > нужно связать JOIN все 4 таблицы. > правильно ли: > Bills INNER JOIN ( Clients INNER JOIN Contracts > USING(ClientID) INNER JOIN Products USING(ProductID) ) ON
> Bills.ContractID = Contracts.ContractID
> ???
> вроде работает, но есть сомнения > 10x
Каким образом ты в MySQL связываешь по индексу?
Вот я делаю:
CREATE TABLE one (
id int(11) NOT NULL default '0',
data varchar(100) default NULL,
PRIMARY KEY (id)
) TYPE=MyISAM;
CREATE TABLE many (
one_id int(11) NOT NULL default '0',
data varchar(100) default NULL,
FOREIGN KEY (one_id) REFERENCES one(id)
) TYPE=MyISAM;
---
Использую phpMyAdmin 2.5.6-rc1 вставляю это добро... все нормально хавает. Затем говорю ему экспортировать структуру БД - он мне дает точь-вточь тоже самое, но без выделенной строчки (FOREIGN KEY)!?
Вопрос: чей глюк?
1. Мой. Т.е. как-то отдельно надо индекс заводить.
2. phpMyAdmin-а
3. Или же MySQL не поддерживает FOREIGN KEY
|
 |  |
Это не глюк, это MyISAM 06.03.04 21:33
Автор: TLoD,Snake Статус: Незарегистрированный пользователь
|
> CREATE TABLE many ( > one_id int(11) NOT NULL default '0', > data varchar(100) default NULL, > FOREIGN KEY (one_id) REFERENCES one(id) > ) TYPE=MyISAM; > --- > > Использую phpMyAdmin 2.5.6-rc1 вставляю это добро... все > нормально хавает. Затем говорю ему экспортировать структуру > БД - он мне дает точь-вточь тоже самое, но без выделенной > строчки (FOREIGN KEY)!? > > Вопрос: чей глюк? > 1. Мой. Т.е. как-то отдельно надо индекс заводить. > 2. phpMyAdmin-а > 3. Или же MySQL не поддерживает FOREIGN KEY
4. Тип таблиц MyISAM не поддерживает внешние ключи, транзакции. Синтаксис MySQL проглатывает для совместимости со стандартами, но реально ничего не делает.
Внешние ключи и транзакции реализованы в MySQL при использовании InnoDB таблиц. Но пока ни один хостер на моей памяти такого не разрешил.
|
 |  |
я просто в двух таблицах один и тотже индекс определяю, а... 27.02.04 13:56
Автор: tdes@work Статус: Незарегистрированный пользователь
|
я просто в двух таблицах один и тотже индекс определяю, а твой пример и в других клиентах не работает, видимо MySQL не поддерживает FOREIGN KEY
|
 |
а кто-то может обяснить, как так получается в квери: 26.02.04 17:54
Автор: tdes@work Статус: Незарегистрированный пользователь
|
а кто-то может обяснить, как так получается в квери:
SELECT ProjectInvoices.*, Invoices.InvoiceID, Contracts.ContractID, Clients.ProjectID AS CPid
FROM ProjectInvoices LEFT JOIN (Invoices
INNER JOIN Contracts USING(ContractID)
INNER JOIN Clients ON (Clients.ClientID = Contracts.ClientID AND Clients.ProjectID = 3) )
ON (Invoices.TypeID = ProjectInvoices.Type )
WHERE ProjectInvoices.ProjectID = 3
GROUP By ProjectInvoices.Type
ORDER BY ProjectInvoices.Type
---
InvoiceID не NULL, хотя выделенная болдом часть не содержит ни одного ряда ?
|
 |  |
так у тебя идет обьединение LEFT, которое обьединяет ВСЕ... 02.03.04 10:32
Автор: sarutobi Статус: Незарегистрированный пользователь
|
> FROM ProjectInvoices LEFT JOIN (Invoices > INNER JOIN Contracts USING(ContractID) > --- > InvoiceID не NULL, хотя выделенная болдом часть не содержит > ни одного ряда ? так у тебя идет обьединение LEFT, которое обьединяет ВСЕ записи слева и непустые справа....
Смотри ситаксис команды JOIN и модификаторы LEFT, Natural Left, Inner, Right.
|
 |  |  |
ага, а справа все записи "пустые" и тем не менее 02.03.04 12:18
Автор: tdes@work Статус: Незарегистрированный пользователь
|
> так у тебя идет обьединение LEFT, которое обьединяет ВСЕ > записи слева и непустые справа.... ага, а справа все записи "пустые" и тем не менее
|
 |  |
Ты уверен в том, что не возвражает ряды данных? 26.02.04 22:49
Автор: Den <Денис Т.> Статус: The Elderman
|
Этот запрос возвращает данные?
select * from Invoices
INNER JOIN Contracts USING(ContractID)
INNER JOIN Clients ON Clients.ClientID = Contracts.ClientID
where Clients.ProjectID = 3 ---
|
 |  |  |
в том то и дело, что не возвращает ничего 27.02.04 11:23
Автор: tdes@ Статус: Незарегистрированный пользователь
|
|
 |  |
и только изменение InvoiceID на
26.02.04 18:25
Автор: tdes@work Статус: Незарегистрированный пользователь
|
и только изменение InvoiceID на
MAX(IF(Clients.ProjectID = 75, Invoices.InvoiceID, NULL)) AS InvoiceID помoгает
|
 |
Насколько я смыслю в колбасных обрезках - inner join... 26.02.04 17:14
Автор: whiletrue <Роман> Статус: Elderman
|
> предположим следующую иерархию в db: > > Bills
> |
> Contracts
> / \
> Clients Products
> ---
> Bills & Contracts связанны по индексу ContractID > Contracts & Clients связанны по индексу ClientID > Contracts & Products связанны по индексу ProductID > нужно связать JOIN все 4 таблицы. > правильно ли: > Bills INNER JOIN ( Clients INNER JOIN Contracts > USING(ClientID) INNER JOIN Products USING(ProductID) ) ON
> Bills.ContractID = Contracts.ContractID
> ???
> вроде работает, но есть сомнения > 10x
Насколько я смыслю в колбасных обрезках - inner join обладает ассоциативностью и коммутативностью, т.е. таблицы можно связывать в любом порядке.
|
 |
Re: MySQL - op JOIN 26.02.04 17:02
Автор: Den <Денис Т.> Статус: The Elderman
|
Я не совсем знаком с нотацией MySQL, но так как утверждается, что MySQL поддерживает нотацию ANSI SQL '92 то можно попробовать так:
select * from Bills
inner join Contracts on Contracts.ContractID = Bills.ContractID
inner join Products on Products.ProductID = Contracts.ProductID
inner join Clients on Client.ClientID = Contracts.ClientID ---
или так
select * from Bills
inner join Contracts (
inner join Products on Products.ProductID = Contracts.ProductID
inner join Clients on Client.ClientID = Contracts.ClientID
) on Contracts.ContractID = Bills.ContractID ---
|
|
|