Помогите из одного набора данных вычесть другой

Игорь

Новичок
Помогите из одного набора данных вычесть другой

Помогите плс. человеку, привыкшему к Oracle и PL SQL получить требуемый набор данных.

Ситуация. Имеем таблицу с категориями. Имеем таблицу с товарами. Имеем транзитную таблицу с отношением многие ко многим. Тут категории пересекаются с товарами. Т.е. один товар может принадлежать нескольким категориям.

Я рисую табличку. Слева -- товары уже добавленные категории, справа -- доступные для добавления. С левыми проблем никаких. Вот запрос
Код:
"select p.id, p.name 
from product p, cat_tov c 
where p.id = c.tov_id and c.cat_id=".$_POST["rb"]." 
order by p.name"
Выбирабтся все товары, которые принадлежат категории с ключом = $_POST["rb"].

Вопрос: как нарисовать справа товары, которые доступны к добавлению, при этом не отображая уже привязанных? В PL SQL я бы просто сделал where p.id not in (select(...данные слева..))

Помогите пожалуйста, посоветуйте.

Такая конструкция почему-то не катит
Код:
select p.id, p.name 
from product p, cat_tov c
where p.id <> c.tov_id and c.cat_id=10
order by p.name
 

Profic

just Profic (PHP5 BetaTeam)
1) самый простой вариант использовать подзапрос если Mysql > 4.1
2) тоже простой вариант (но тормозной):
при первом селекте все id записывать в массив
а потом '...where p.id not in (' . implode (',', $ids) . ')...'
3) убил
PS. Чего-то как впихнуть условие в первый селект не придумалось :)
PPS. Исправил запрос
PPPS. Убил запрос, т.к. написан криво. тяпница...
 

Игорь

Новичок
Извиняюсь за невежество, temporaly table нужно потом делать drop? Она назывется temporaly для того, чтобы кто-нибудь другой туда чего-нибудь не написал? Кстати ошибка Join on - пропущено.
 

fixxxer

К.О.
Партнер клуба
Временная таблица автоматически удаляется по завершении соединения, а ее имя действительно только в течение данного соединения. Это означает, что в двух разных соединениях могут использоваться временные таблицы с одинаковыми именами без конфликта друг с другом или с существующей таблицей с тем же именем (существующая таблица скрыта, пока не удалена временная таблица)
(c) мануал
 

Profic

just Profic (PHP5 BetaTeam)
Хе все эказалось проще
[sql]
select p.id, p.name
from product p left join cat_tov c on p.id=c.tov_id
where c.cat_id Is null or c.cat_id <> 10;
[/sql]
(ожидая вопросы :)
is null указывает на то, что товар ни в одной категории
<> 10 указывает, что товар не принадлежит 10 категории :)
 

Игорь

Новичок
Пошёл вторым путём. Первый технически невозможен. А третий написан с ошибкой. После исправления -- пустой набор данных. Так что id в массив, затем not in

-~{}~ 30.07.04 15:48:

Блин, профик, а ведь работает. Пойду скрипт перепишу...
 

Profic

just Profic (PHP5 BetaTeam)
ЗЫ. Может быть еще нужно будет добавить group by p.id. Чего-то голова уже почти не варит :) тяпница :)

-~{}~ 30.07.04 15:53:

Игорь
Кстати если исключить вариант того, что товар может не принадлежать ни одной категории, то is NULL можно убрать и возможно тогда даже индексы будут юзаться :)
 

Игорь

Новичок
Этот вариант исключать никак нельзя. Так что на индексы придётся забить.

-~{}~ 30.07.04 16:06:

Делаю откат к варианту 2. Данный запрос глючит, когда один товар принадлежит нескольким категориям. Т.е. не Null, но и не XX.
 
Сверху