выборка из 3 таблиц

  • Автор темы Автор темы IgorCH
  • Дата начала Дата начала

IgorCH

Новичок
выборка из 3 таблиц

Есть 3 таблицы.
1 таблица
Id_a name_a

2 таблица
Id_b name_b

3 таблица
Id name_1 name_2 name_3 name_4

В таблице 3 одни цифры (id из первых двух), т.е.:
Id name_1 name_2 name_3 name_4
0 0 1 2 5
1 3 3 0 0
2 5 2 2 0
3 0 7 1 5
4 1 0 0 5

Как мне сделать выборку из таблицы 3, чтоб вместо цифр вставлялись name_a и name_b???
name_1 это id_a из таблицы 1
name_2 это id_b из таблицы 2
name_3 это id_a из таблицы 1
name_4 это id_b из таблицы 2
 
к двум ячейкам получается, а вот к 4 нет

$sql = "SELECT id_a, name_a, id_b, name_b, name_1, name_2, name_3, name_4
FROM таблица 1
LEFT JOIN таблица 2 ON таблица_1.name_1 = таблица_2.id_a
LEFT JOIN таблица 3 ON таблица_1.name_2 = таблица_3.id_b";
потом вывожу
$result = mysql_query($sql,$con) or die (mysql_error()."<br>".$sql);
while ($row = @ mysql_fetch_array($result)) {
print $row['name_1'];
print $row['name_2']
}

А вот как еще и name_3 и name_4 подсоединить, не получается.
 
LEFT JOIN tbl AS T1 ...
LEFT JOIN tbl AS T2 ...

но зачем тебе это?
или пример был высосан из пальца и реальные данные отличаются от
name_1 это id_a из таблицы 1
name_2 это id_b из таблицы 2
name_3 это id_a из таблицы 1
name_4 это id_b из таблицы 2
 
не совсем понял.
Ну вот реальный код (просто названия ячеек сложные):
$sql = "SELECT id_Rpred, name_Rpred, id_Rprep, name_Rprep, predmet, prepod, predmet_kr, prepod_kr
FROM raspis
LEFT JOIN raspis_predmet ON raspis.predmet = raspis_predmet.id_Rpred
LEFT JOIN raspis_predmet ON raspis.predmet_kr = raspis_predmet.id_Rpred
LEFT JOIN raspis_prepod ON raspis.prepod = raspis_prepod.id_Rprep
LEFT JOIN raspis_prepod ON raspis.prepod_kr = raspis_prepod.id_Rprep
WHERE gruppa=1 AND kurs=1 ORDER by id_R DESC";

при этом ошибка Column 'id_Rpred' in field list is ambiguous
 
ты понимаешь, в чем заключается ошибка? зачем два раза джойнить одну и ту же таблицу?
 
1) указывать алиасы для таблиц: "raspis_predmet AS ..." и т.д.
2) указывать имена таблиц (алиасов) во всех обращениях к полям: и в списке полей для выборки, и в where, и в order by.
 
для двух я понимаю как сделать
$sql = "SELECT t2.id_Rpred, t2.name_Rpred, t3.id_Rprep, t3.name_Rprep, predmet, prepod, predmet_kr, prepod_kr
FROM raspis
LEFT JOIN raspis_predmet as t2 ON raspis.predmet = t2.id_Rpred
LEFT JOIN raspis_prepod as t3 ON raspis.prepod = t3.id_Rprep
WHERE gruppa=1 AND kurs=1 ORDER by id_R DESC";

а вот как сюда добавить еще
raspis.predmet_kr = t2.id_Rpred
raspis.prepod_kr = t3.id_Rprep
 
хотелось бы узнать, какой смысл у всех этих таблиц, полей, и что ты хочешь с ними сделать. Иначе сложно что-либо с уверенностью сказать.
 
в таблице raspis одни цифры
каждая цифра соответствут названию (name_Rpred и name_Rprep) из других таблиц, т.е.:
predmet соответствует id_Rpred -> name_Rpred
predmet_kr соответствует id_Rpred -> name_Rpred
prepod соответствует id_Rprep -> name_Rprep
prepod_kr соответствует id_Rprep -> name_Rprep

Мне надо вывести не цифры, а названия (имена), т.е.:
получиться 4 названия (имени)
predmet
prepod
predmet_kr
prepod_kr
 
просто название ячейки
raspis это таблица расписания занятий, она уже занесена
Предмет Преподаватель
Предмет по кр. недели Преподаватель по кр. недели

Мне нужно вывести сразу все 4 значения

-~{}~ 12.09.06 15:07:

вывести надо что то типо:
<table><tr>
<td>Предмет / Преподаватель </td>
<td>Предмет по красной недели/ Преподаватель по красной недели</td>
</tr></table>
 
может значения из таблиц загнать в двухмерный массив?
например,
name[id_Rpred][name_Rpred]
name_1[id_Rprep][name_Rprep]

-~{}~ 12.09.06 15:11:

не я закончил учиться, причем не на программиста, близко с программированием ни что не лежало :))
просто помагаю
 
ну ладно, кое-как удалось понять :)

вообщем, запрос будет выглядеть примерно так:

$sql = "SELECT r_predmet.name_Rpred, r_predmet_kr.name_Rpred, r_prepod.name_Rprep, r_prepod_kr.name_Rprep
FROM raspis
LEFT JOIN raspis_predmet AS r_predmet ON raspis.predmet = r_predmet.id_Rpred
LEFT JOIN raspis_predmet AS r_predmet_kr ON raspis.predmet_kr = r_predmet_kr.id_Rpred
LEFT JOIN raspis_prepod AS r_prepod ON raspis.prepod = r_prepod.id_Rprep
LEFT JOIN raspis_prepod AS r_prepod_kr ON raspis.prepod_kr = r_prepod_kr.id_Rprep
WHERE raspis.gruppa=1 AND raspis.kurs=1 ORDER by raspis.id_R DESC";

-~{}~ 12.09.06 18:14:

не я закончил учиться, причем не на программиста, близко с программированием ни что не лежало )
просто помагаю
про контрольную недею - это была догадка, что значит "кр."
 
не есть две недели синия и красная, расписание может немного различаться

-~{}~ 12.09.06 15:22:

а как при таком сделать вывод значений?
до этого я делал так
$name_Rpred = $row['name_Rpred'];
$name_Rprep = $row['name_Rprep'];

а теперь для 4 как?

-~{}~ 12.09.06 15:28:

ВСЕ БОЛЬШОЕ СПАСИБО!!!!
разобрался
$name_Rpred = $row['0'];
$name_Rprep = $row['2'];

$name_Rpred_kr = $row['1'];
$name_Rprep_kr = $row['3'];
 
1) назначить алиасы выбираемым полям:
SELECT r_predmet.name_Rpred AS name_Rpred, r_predmet_kr.name_Rpred AS name_Rpred_kr, r_prepod.name_Rprep AS name_Rprep, r_prepod_kr.name_Rprep as name_Rprep_kr

или

2) использовать нумерованный $row:
[m]mysql_fetch_row[/m]
 
Сверху