|
|
|
| Каюсь, забыл про систему(отдельная тема для каждого вопроса)
Пусть будет какой либо базар. Где пользователи могут добавлять свой товар, оставлять характеристики и описания
.tovar_id user_id tovar_description add_date etc
|
И каждый пользователь может предложить свой товар, на обмен товару другого пользователя.
user_id это идентификатор пользователя который хочет предложить обмен
tovar_id_to_exchange это идентификатор товара, который пользователь предлагает на обмен
tovar_id это идентификатор товара другого пользователяtovar_
id tovar_id_to_exchange user_id describtion add_date
|
Таблицу юзеров описывает нет смысла, да и она не нужна по сути.
Ну и самое интересное. Нужно получить список товаров, текущего пользователя(есть ид), которые он может обменять на конкретный товар(есть ид). Но нужно убирать из списка товары, которые пользователь уже поставил на обмен. И не нужно выбирать товары, если текущий товар является товаром пользователя.
Вобщем если не брать самое последнее условие, я выбираю вложенным селектом
select *
from tovar
where tovar_id not in(
select tovar_id_to_exchange
from exchange
where user_id = 2 and tovar_id = 5
)
and user_id = 2
|
Еще немного опишу подробней. Пользователь с ид 2, зашел на страницу товара с ид 5, и должен получить список своих товаров, которые он еще не поставил на обмен этому товару с ид 5. Но как в этом запросе еще "предохранится" от вывода списка товара на обмен, если пользователь зашел на свой собственный товар?
Заранее спасибо, буду рад любой помощи
Вот как это выглядит сейчас, благодаря Трианону удалось избежать 2х вложенных селектов. Но может всеже можно еще как то оптимизировать эту выборку?
select *
from tovar
where tovar_id not in(
select tovar_id_to_exchange
from exchange
where user_id = 2 and tovar_id = 5
)
and tovar_id not in(
select t1.tovar_id
from tovar t1
JOIN
tovar t2
USING(user_id)
where
t2.tovar_id = 5
)
and user_id = 2
|
| |
|
|
|
|
|
|
|
для: Слух
(02.02.2010 в 11:02)
| | общая методика выбрать отсутствующие это
основная_таблица t1
LEFT JOIN таблица_отсутствия t2 ON условие_присутствия
WHERE t2.id IS NULL
|
В качестве таблиц могут быть селекты.
Будет ли это более оптимально, узнается опытным путем. | |
|
|
|
|
|
|
|
для: Trianon
(02.02.2010 в 11:55)
| | Мне как раз нужно все, кроме 1,2,3,4
я использую конструкцию NOT IN()
Например как сделать такой запрос не используя вложенный select, а используя join
select *
from tovar
where tovar_id not in(
select tovar_id_to_exchange
from exchange
where user_id = 2 and tovar_id = 5
)
|
Например если бы мне надо было получить то что надо исключить я бы сделал так(незнаю правильно ли), а как выбрать наоборот?
select t1.*
from tovar
right join exchange e
on e.user_id = 2 and e.tovar_id = 5
|
Разобрался, спасибо
select t1.*
from tovar
left join exchange e
on (e.user_id = 2 and e.tovar_id = 5 )
where e.tovar_id IS NULL
|
| |
|
|
|