|
|
|
|
|
для: Trianon
(01.02.2010 в 22:11)
| | Спасибо то что нужно.
Насколько я понял
USING(user_id) = ON m2.user_id = m1.user_id
|
Как то все очень просто получилось, наверно я вчера что-то не то пробовал. Не хватает опыта(, я знал что нужно "заджойнить" таблицу саму на себя. | |
|
|
|
|
|
|
|
для: Слух
(01.02.2010 в 17:39)
| | >И тогда уже спрошу про такую связь.
Это крайне неудачный шаг.
Создайте отдельную тему.
Каждая тема описывает определенную проблему.
Сами темы никто не экономит.
Не факт, что один и тот же человек захочет дискутировать по обеил проблемам.
И уж совершенно точно никто не пожелает высказывать мысли вперемешку.
По первому вопросу.
Вместо сложного запроса лучше применить автосоединение
messages m1 JOIN messages m2 USING(user_id) | |
|
|
|
|
|
|
| Например есть такая структура
Можно ли одним запросом вывести все сообщения пользователя, по идентификатору его сообщения?
До вложенного запроса я конечно и сам додумался, но возможно есть более "изящный" и правильный вариант?
select * from messages where user_id = (select user_id from messages where msg_id = 4);
|
И тогда уже спрошу про такую связь.
Пусть будет какой либо базар. Где пользователи могут добавлять свой товар, оставлять характеристики и описания.
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. Но как в этом запросе еще "предохранится" от вывода списка товара на обмен, если пользователь зашел на свой собственный товар?
Впринципе, первый вопрос про селект из одной базы мне для этого и нужен.
Заранее спасибо, буду рад любой помощи
З.Ы. Ну и да, до такого я додумался сам. Правда я оочень не люблю вложенные селекты, работает не супер быстро, особенно с IN(), да и выглядит мягко говоря страшно(
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 tovar_id
from tovar
where (
select user_id
from tovar
where tovar_id = 5)
)
and user_id = 2
|
| |
|
|
|
|