URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7567
[ Назад ]

Исходное сообщение
"Если 2 поля ссылаются на одну таблицу, можно ли одним"

Отправлено rookie , 28-Авг-08 16:49 
запросом достать оба? Напр.
СОТРУДНИКИ
  ID
  ФАМИЛИЯ
  и т.д.
------------
ДЕЛА
  ЗАКАЗЧИК -> СОТРУДНИКИ (ID)
  ИСПОЛНИТЕЛЬ -> СОТРУДНИКИ (ID)
  бла бла
---------------
Надо достать две разные фамилии.
Запрос типа "SELECT staff.name, staff.name FROM staff, deals WHERE deals.customer=staff.id AND deals.executor=staff.id" вернёт имя только одного 2 раза.

Обязательно надо делать 2 запроса или есть способ сэкономить?
Может быть по-другому спроектировать структуру таблиц?


Содержание

Сообщения в этом обсуждении
"Если 2 поля ссылаются на одну таблицу, можно ли одним"
Отправлено phpcoder , 28-Авг-08 16:55 
>Обязательно надо делать 2 запроса или есть способ сэкономить?

Про JOIN-ы уже читали?


"Если 2 поля ссылаются на одну таблицу, можно ли одним"
Отправлено rookie , 28-Авг-08 17:22 
>>Обязательно надо делать 2 запроса или есть способ сэкономить?
>
>Про JOIN-ы уже читали?

Нет.
Напишите пример запроса для решения данной задачи, если не трудно


"Если 2 поля ссылаются на одну таблицу, можно ли одним"
Отправлено angra , 28-Авг-08 18:17 
Вот два варианта, сами смотрите какой вам больше подходит. Они отличаются по скорости, надежности и обработке целостности. Обычно нужен второй вариант.
select * from staff;
+------+-------+
| id   | name  |
+------+-------+
|    1 | name1 |
|    2 | name2 |
|    3 | name3 |
+------+-------+

select * from deals;
+----------+----------+
| customer | executor |
+----------+----------+
|        1 |        2 |
|        1 |        3 |
|        2 |        3 |
|        2 |        4 |
+----------+----------+

1. Неявный join:
select s1.name, s2.name from deals as d, staff as s1, staff as s2 where d.customer=s1.id and d.executor=s2.id;
+-------+-------+
| name  | name  |
+-------+-------+
| name1 | name2 |
| name1 | name3 |
| name2 | name3 |
+-------+-------+

2. Явный left join
select s1.name, s2.name from deals as d left join staff as s1 on(d.customer=s1.id) left join staff as s2 on (d.executor=s2.id);
+-------+-------+
| name  | name  |
+-------+-------+
| name1 | name2 |
| name1 | name3 |
| name2 | name3 |
| name2 | NULL  |
+-------+-------+


"Если 2 поля ссылаются на одну таблицу, можно ли одним"
Отправлено rookie , 29-Авг-08 10:10 
>Вот два варианта, сами смотрите какой вам больше подходит. Они отличаются по

СПАСИБО!
Всё работает
Оба пригодятся