информационная безопасность
без паники и всерьез
 подробно о проекте
Spanning Tree Protocol: недокументированное применениеГде водятся OGRыСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 PHP2Shell начали эксплуатировать... 
 Четыре уязвимости Plex объединяют... 
 Вредоносный релиз LiteLLM 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / beginners
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
в том то и дело, что не возвращает ничего 27.02.04 11:23  Число просмотров: 1212
Автор: tdes@ Статус: Незарегистрированный пользователь
<"чистая" ссылка>
<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

---
1





Рейтинг@Mail.ru


  Copyright © 2001-2026 Dmitry Leonov   Page build time: 1 s   Design: Vadim Derkach