Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Список контактов 
V
    Опции темы
MrDmitry
Дата 1.9.2009, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Я наверное не правильно выразился
Сейчас постараюсь обьяснить

есть 2 списка
в одном выводится список всех сообщений которые пришли нам (Входящие)
в другом выводится список сообщений которые отправил пользователь (Исходящие)
так вот нужно вывести всех пользователей из спиков Входящие,Исходящие, чтоб выводились все пользователи которые попали в эти списки, но выводились 1 раз, тоесть формируется список контактов

вот sql запрос списка "Входящие"

Код

SELECT m_id, uname, u.lastname, m.user_id, m.date_send, m.theme, m.message
FROM messages m, users u WHERE m.recipient_id=:user_id AND u.id=m.user_id

вот sql запрос списка "Исходящие"
Код

SELECT m_id, uname, u.lastname, m.user_id, m.date_send, m.theme, m.message
FROM messages m, users u WHERE m.user_id=:user_id AND u.id=m.recipient_id


Это сообщение отредактировал(а) MrDmitry - 1.9.2009, 11:09
PM MAIL   Вверх
Gluttton
Дата 1.9.2009, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Ну дык, и UNION тебе в руки smile ...
(Между запросами, для объединения их результатов необходимо поместить UNION - в тех случаях, когда необходимо, что бы результаты не повторялись (т.е. отображались только уникальные записи) или UNION ALL - когда необходимо, что бы отображались все данные).


--------------------
Слава Україні!
PM MAIL   Вверх
Akina
Дата 1.9.2009, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Код

select distinct users.id, users.username
from
(
  (
  select sender_id id
  from messages
  where recipient_id=:userID
  )
union
  (
  select recipient_id 
  from messages
  where sender_id=:userID
  )
) mess
inner join users
on users.id=mess.id



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
DimW
Дата 1.9.2009, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Код

select u.name, u.lastname, m.user_id
from messages m, users u where m.recipient_id=:user_id and u.id=m.user_id
union
select u.name, u.lastname, m.user_id
from messages m, users u where m.user_id=:user_id and u.id=m.recipient_id


Цитата(Akina @  1.9.2009,  11:24 Найти цитируемый пост)
select distinct users.id, users.username

Akina,  в данном случае distinct это излишество.

PM MAIL ICQ   Вверх
MrDmitry
Дата 1.9.2009, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



щас попробую

Добавлено через 12 минут и 54 секунды
Сообвственно вот что выдалось
The used SELECT statements have a different number rof colomns

Это сообщение отредактировал(а) MrDmitry - 1.9.2009, 11:34
PM MAIL   Вверх
DimW
Дата 1.9.2009, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(MrDmitry @  1.9.2009,  11:33 Найти цитируемый пост)
Сообвственно вот что выдалось

собственно покажите что запускали.
PM MAIL ICQ   Вверх
Akina
Дата 1.9.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(DimW @  1.9.2009,  12:26 Найти цитируемый пост)
 в данном случае distinct это излишество

Угу. Но на время выполнения это не повлияет, а направление мысли покажет.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
MrDmitry
Дата 1.9.2009, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Код

SELECT m_id, uname, u.lastname, m.user_id, m.date_send, m.theme, m.message
FROM messages m, users u WHERE m.recipient_id=:user_id AND u.id=m.user_id
UNION
SELECT m_id, uname, u.lastname, m.user_id, m.date_send, m.theme, m.message
FROM messages m, users u WHERE m.user_id=:user_id AND u.id=m.recipient_id

вот так писал
PM MAIL   Вверх
DimW
Дата 1.9.2009, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(MrDmitry @  1.9.2009,  12:29 Найти цитируемый пост)
вот так писал

ну и зря, направление мысли у Akina, было оптемальней, т.к. он в таблицу с юзерами приходит уже со смердженными сообшениями.

Цитата(Akina @  1.9.2009,  12:28 Найти цитируемый пост)
Но на время выполнения это не повлияет

можно было бы проверить и поспорить, но что то лениво smile (да и БД будет другая)

Это сообщение отредактировал(а) DimW - 1.9.2009, 13:05
PM MAIL ICQ   Вверх
MrDmitry
Дата 1.9.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



я из его примера не понел что есть 
sender_id и mess
PM MAIL   Вверх
Zloxa
Дата 1.9.2009, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Akina @  1.9.2009,  12:28 Найти цитируемый пост)
Но на время выполнения это не повлияет,

В общем случае повлияет.
Лишь в частном, когда на users.id имеет ограничение уникальности, это ограничение включено и валидно, оптимизатор будет иметь основания опустить distinct.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
DimW
Дата 1.9.2009, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(MrDmitry @  1.9.2009,  13:14 Найти цитируемый пост)
я из его примера не понел что есть 
sender_id и mess

ну если recipient_id у вас получатели(входящие), то несложно догадаться что sender_id отправители(исходящие),  mess это алиас подзапроса(внимательней посмотрите запрос).
PM MAIL ICQ   Вверх
Zloxa
Дата 1.9.2009, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Zloxa @  1.9.2009,  13:15 Найти цитируемый пост)
В общем случае повлияет.

Кстати, пытаясь это продемонстрировать, наткнулся на багу в 11g smile)
DimW, можешь прогнать на десятке, девятке (у меня дома не стоит)?

Код

Connected to Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 
Connected as ZLOXA
 
SQL> create table tst(id not null,val) as (select 1 id,2 val from dual
  2                       union all select 1,2 val from dual);
 
Table created
SQL> create index tst$id$idx on tst(id);
 
Index created
SQL> alter table tst add constraint tst$id$unc unique(id) using index tst$id$idx novalidate;
 
Table altered
SQL> select distinct * from tst;
 
        ID        VAL
---------- ----------
         1          2
         1          2
 
SQL>



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
DimW
Дата 1.9.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(Zloxa @  1.9.2009,  13:30 Найти цитируемый пост)
девятке

Код

Connected to Oracle9i Enterprise Edition Release 9.2.0.8.0 
Connected as jdbf
 
SQL> 
SQL> create table tst(id not null,val) as (select 1 id,2 val from dual
  2                                        union all select 1,2 val from dual);
 
Table created
SQL> create index tst$id$idx on tst(id);
 
Index created
SQL> alter table tst add constraint tst$id$unc unique(id) using index tst$id$idx novalidate;
 
Table altered
SQL> select distinct * from tst;
 
        ID        VAL
---------- ----------
         1          2


есть мысли почему так?
PM MAIL ICQ   Вверх
Zloxa
Дата 1.9.2009, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(DimW @  1.9.2009,  13:38 Найти цитируемый пост)
есть мысли почему так? 

Баг, не иначе... ;)
ЦБО обязан был выполнить дистинкт если ограничение уникальности активно но не валидировано. (я однажды на поиск причины по какой мне давался не правильный план убил безумно много времени, пока не выяснил что констрейнты были включены без валидации).

Собсно я пытался покзать результат работы этого скрипта, но на 11м он мне вернул одинаковые планы, ввиду бага. На десятке, девятке, уверен планы будут разные:
Код

create table tst(id not null,val) as (select 1 id,2 val from dual 
                     union all select 1,2 val from dual);
create index tst$id$idx on tst(id);                     
alter table tst add constraint tst$id$unc unique(id) using index tst$id$idx novalidate;
explain plan for select distinct id from tst;
select * from table(dbms_xplan.display());
delete from tst where rownum =1;
alter table tst modify constraint  tst$id$unc validate;
explain plan for select distinct id from tst;
select * from table(dbms_xplan.display());
drop table tst;



Это сообщение отредактировал(а) Zloxa - 1.9.2009, 13:50


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.1423 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.