Не поможете оптимизировать запрос? Join 2-х таблиц....

Alkinoy

Guest
Не поможете оптимизировать запрос? Join 2-х таблиц....

Трям. Описываю задачу. Есть таблица с названием обектов. Есть таблица, в которой указано, какому юзверю к какому объекту можно получить доступ. Причем, одному юзверю можно получить доступ к произвольному числу объектов, и к одному объекту может получить доступ произвольное число юзверей.
Структуру придумал такую. Первая таблица:
Id_юзверя Описание Еще энное количество полей...

Вторая таблица:
Id_объекта Описание Еще энное количество полей...

Третья таблица (соответствие узлов юзверям - то есть кому куда можно)
Id_юзверя Id_объекта

Перед запросом мы уже знаем Id_юзверя.
Теперь напосредственно задача: Надо вывести список ВСЕХ объектов и пометить в нем те, доступ к которым имеет юзверь.
Мне придумалось такое:
PHP:
//а вот тут выводим все узлы и помечаем те, к которым привязан

$query='create temporary table TCUz select * from CUz where CUzContrId = "'.$contrid.'"';

mysql_query($query, $db);

$res_cuz = mysql_query('select * from Uz left join TCUz on Uz.UzId = TCUz.CUzUzId', $db);

while($row_cuz = mysql_fetch_array($res_cuz))
{
  echo '<option value="'.$row_cuz["UzId"].'"';
!!!!! - if ($row_cuz["CUzContrId"] == $contrid) {echo 'selected';};
PHP:
  echo '>'.$row_cuz["UzId"].'-'.$row_cuz["UzDesc"].'</option>';
}

mysql_query('drop table TCUz', $db);
Вот то что выделено !!!- это как раз и есть пометка тех объектов, к которым юзверь уже имеет доступ.
Теперь словами. Сначала создали временную таблицу, в которую выделили все записи из третьей таблички, потом лефт джоин таблицу с объектами (слева) и временную таблицу. Таким образом, если в строке в каком то поле получим нул, значит этой строки нет во временной таблице, и следовательно юзверю доступа туда нет. Если есть - значит есть доступ и помечаем.

Но можно ли это сделать одним запросом, а не тремя?
 

Falc

Новичок
А зачем тебе временая таблица?
Лефт джойни к таблице с обектами, таблицу связки (мн. ко мн.).
И все.
 

Alkinoy

Guest
мне надо получить так (сжато)
PHP:
Id_объекта       Описание      Id_юзверя
1                   первый      3
2                   второй      NULL
3                   третий       3
То есть сразу понятно, к 1 и 3 узлам есть доступ, а ко второму - нет
А как ты говоришь, я что то не понял? Просто джоин - получу много повторений, джоин с выборкой по условию - получу ТОЛЬКО те чтроки, к которым имеет доступ......
 

Falc

Новичок
Запрос будет что-то вроде:
SELECT...
FROM object
LEFT JOIN user_object ON user_object.object_id = object.id AND user_object.user_id = $user_id
 

Alkinoy

Guest
Да, Falk, ты прав как всегда. Спасибо. Проблема решена.
 
Сверху