Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Cвязь двух таблиц со сложным условием не вхождения
 
 автор: Слух   (02.02.2010 в 11:02)   письмо автору
 
 

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

Пусть будет какой либо базар. Где пользователи могут добавлять свой товар, оставлять характеристики и описания
.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 
    

  Ответить  
 
 автор: Trianon   (02.02.2010 в 11:55)   письмо автору
 
   для: Слух   (02.02.2010 в 11:02)
 

общая методика выбрать отсутствующие это
основная_таблица t1 
  LEFT  JOIN таблица_отсутствия t2 ON условие_присутствия 
WHERE t2.id IS NULL

В качестве таблиц могут быть селекты.
Будет ли это более оптимально, узнается опытным путем.

  Ответить  
 
 автор: Слух   (02.02.2010 в 12:31)   письмо автору
 
   для: 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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования