К каждой записи одной таблицы-несколько записей из друго

Sandr

Новичок
К каждой записи одной таблицы-несколько записей из друго

Вот прошу помощи

Есть несколько таблиц, в том числе-
Работа (дальше Р) поля id ispId .....
Исполнитель (И) id name phone ....etc
......

в каждой записи Р есть по одному ispId
так вот встала задача переписать базу/скрипты на возможность добавления большого кол-ва Исполнителей
не менее 40!

Подскажите оптимальный способ и структуру
 

Sandr

Новичок
добавить 39 полей ispIdxx мне кажется некрасивым решением :)

может конвертнуть поле (P) ispID в varchar 255 и вписывать туда (И)id через разделитель?
и потом искать по like %id%
но както тож некрасиво
 

kruglov

Новичок
p.s. Вообще, крайне полезно почитать какие-нибудь книжки из серии "Базы данных для чайников", прежде чем бросаться в программирование
 

Sandr

Новичок
2kruglov
спасиба :)
достаточно было одного поста :)

есть способ не создавать еще одну таблицу?
 

Sandr

Новичок
теперь второй вопрос - а возможно ли написать один запрос к mysql, в этом случае, возвращающий массив в котором
перечислены работы для каждой из которых перечисленны все исполнители?

если связка одна строка первой таблицы к одной строке второй таблицы то вот так
Код:
SELECT p.id, p.num, c.cid, c.name, c.pcid
		      FROM 1_table as p
		      LEFT JOIN 2_table as c on (p.cid=c.cid)
		      WHERE p.num=5 ORDER BY p.num DESC limit $offset, $per_page
а вот как написать запрос один ко многим ?
если писать по этому-же сценарию я получаю со второй таблицы лишь первое вхождение :(

-~{}~ 06.11.07 12:12:

изменю вопрос

есть несколько таблиц (грубо)-
работа id ispId zakId opisanie
исполнитель id fio
заказчик id fio
работа id<>исполнитель id
работа id<>заказчик id

как оптимизировать запрос чтобы получить
список работ с фамилиями заказчиков и исполнителей
 

Sandr

Новичок
написал
Код:
		$query = "SELECT * FROM " . _PREFIX . "_work as w " .
				"LEFT JOIN " . _PREFIX . "_manager as m on (w.id=m.wid)" .
				"LEFT JOIN " . _PREFIX . "_users as u on (u.id_fu=m.mid)" .
но если одной работе соответсвует несколько исполнителей то в массиве я получаю соответсвующее колво строк этой работы с разными фамилиями
а хотелосьбы одну строку на каждую работу и в ней перечисление фамилий исполнителей/заказчиков
 

Sandr

Новичок
почему не работает конструкция ?
Код:
		$query = "SELECT w.*, m.*, u.id_fu, group_concat(u.name) AS manager " .
				"FROM " . _PREFIX . "_table AS w " .
				"LEFT JOIN " . _PREFIX . "_manager AS m ON w.id=m.wid " .
				"LEFT JOIN " . _PREFIX . "_users AS u ON u.id_fu=m.mid " .
				"GROUP BY w.id ";
достаточно заменить "group_concat(u.name) AS manager" на "u.name AS manager" - все работает но ячейка manager содержит лишь одного менеджера :(
 

Gas

может по одной?
без concat'а находит, а с ним нет? не верю, может у тебя версия mysql ниже 4.1 и запрос выдаёт ошибку.
 

Sandr

Новичок
понял - посыпаю голову пеплом - тестил на машине с 4.1 а перенес на 3.2

-~{}~ 07.11.07 16:49:

(таблица work - W)
id
opisanie
zId (id заказчика)
...

(таблица users - U)
id
name
...

(таблица manager - M)
wId (id работы)
uId (id юзера)

(таблица ispolnitel - I)
wId (id работы)
uId (id юзера)

(таблица zakazchik - Z)
id
fio
address
.....

вот проблема как выбрать строки!! (их может быть больше одной)
для конкретного заказчика, исполнителя, менеджера ?
(т.е все три критерия важны!)

вот наваял такогоооо! но в результате я вижу в результате лишь ОДНОГО!!! исполнителя № 1 "поле ispolnitel" (хотя для работы их несколько) и
ОДНОГО!!! манагера № 14 "поле manager" (хотя для работы их несколько)
по которым был задан критерий отбора (№1 и №14) соответственно

Код:
SELECT w.*, m.*, i.*, 
group_concat(u.id) AS manId , group_concat(u.name) AS manager, 
group_concat(ui.id) AS ispId , group_concat(ui.name) AS ispolnitel 
FROM work AS w 
LEFT JOIN manager AS m ON w.id=m.wid 
LEFT JOIN ispolnitel AS i ON w.id=i.wid 
LEFT JOIN users AS u ON u.id_fu=m.uid 
LEFT JOIN users AS ui ON ui.id_fu=i.uid 
WHERE m.uid=14 AND i.uid=1 AND w.zId=1 GROUP BY w.id

где рыть?

-~{}~ 07.11.07 16:53:

точнее - я понимаю почему - "WHERE m.uid=14 AND i.uid=1"

но как тогда построить запрос?

-~{}~ 07.11.07 17:00:

да и вообще такой запрос неверен
отошлите чтоль к хорошей статье про такие запросы

-~{}~ 08.11.07 10:23:

ну и где те господа уверявшие что надо хранить в отдельной таблице списки исполнителей?

Автор оригинала: kruglov
Таблица исполнитель_id <-> работа_id
 

AmdY

Пью пиво
Команда форума
теперь второй вопрос - а возможно ли написать один запрос к mysql, в этом случае, возвращающий массив в котором
перечислены работы для каждой из которых перечисленны все исполнители?
Тебе нужен INNER JOIN, а дальше РНР
 
Сверху