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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборка из 2х таблиц, помогите составить запрос 
V
    Опции темы
AnemoN
Дата 10.12.2009, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть две таблицы names и names_used

names
nid    name
---     ---
1       vasya
2       kolya
3       petya
4       vanya

names_used
nid    pid
---     ---
1       2
3       2

Необходимо составить запрос, который вернет names.nid, names.name, т.о. что не существует names_used.nid = names.nid или существует, но names_used.pid!=x
PM MAIL   Вверх
Gluttton
Дата 10.12.2009, 09:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



ПисАл на коленке, возможно будут ошибки.
Код

select
    s.nid,
    s.name
from
(
    select
        n.nid,
        n.name,
        nu.nid as nidu,
        nu.pid
    from 
        names as n
        left join names_used as nu
        on n.nid=nu.nid
)   as s
    where s.nidu is null
    or s.pid<>x


Это сообщение отредактировал(а) Gluttton - 10.12.2009, 14:30


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


Новичок



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

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



Большое вам спасибо, код идеально работает
PM MAIL   Вверх
DimW
Дата 10.12.2009, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



так что ли:
Код

select * 
  from names n
 where not exists (select * from names_used nu where nu.nid = n.nid)  
union all
select n.* 
  from names n
      ,names_used nu
 where nu.nid = n.nid
   and nu.pid != :x


Это сообщение отредактировал(а) DimW - 10.12.2009, 10:57
PM MAIL ICQ   Вверх
Zloxa
Дата 10.12.2009, 10:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



Цитата(Gluttton @  10.12.2009,  09:37 Найти цитируемый пост)
ПисАл на коленке, возможно будут ошибки.

а подзапрос зачем?
Код

    select
        n.nid,
        n.name,
    from 
        names as n
    left join names_used as nu
       on n.nid=nu.nid
    where nu.nid is null
         or nu.pid = :x



Это сообщение отредактировал(а) Zloxa - 10.12.2009, 10:25


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


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


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

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



Zloxa, 
Цитата(Zloxa @  10.12.2009,  10:04 Найти цитируемый пост)
а подзапрос зачем?

Боялся, что не правильно таблицы соединятся (на работу торопился smile )...

AnemoN, 
Цитата(AnemoN @  10.12.2009,  09:44 Найти цитируемый пост)
Большое вам спасибо, код идеально работает

Не за что, только я ошибся и вместо неравенства с переменной поставил критерий на равенство smile ...

DimW, 
Цитата(DimW @  10.12.2009,  09:52 Найти цитируемый пост)
так что ли:

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


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


Эксперт
***


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

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



Цитата(Gluttton @  10.12.2009,  10:24 Найти цитируемый пост)
но думаю, что предложенный тобою вариант будет выполняться дольше чем мой. 

грохнул уже  smile smile
PM MAIL ICQ   Вверх
Zloxa
Дата 10.12.2009, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



Цитата(DimW @  10.12.2009,  10:34 Найти цитируемый пост)
грохнул уже

Зачем???... правильный ведь вариант был.
А то что оптимизатор еще не способен нормальный план для такого выражения составить - то ж косяки оптимизатора.
SQL - декларативный язык. Он выражает мысль(цель) но не методы(средства) ее реализации. smile
за то он мне и люб smile


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


Эксперт
***


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

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



Цитата(Zloxa @  10.12.2009,  10:40 Найти цитируемый пост)
Он выражает мысль(цель) но не методы(средства) ее реализации.

мда, не хорошо получилось, ща подредактирую... smile
PM MAIL ICQ   Вверх
AnemoN
Дата 10.12.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Gluttton @  10.12.2009,  10:24 Найти цитируемый пост)
не уверен, но думаю, что предложенный тобою вариант будет выполняться дольше чем мой. 


Сейчас проверил оба запроса к бд - результаты неоднозначные.

При 65.000 записей в names - ваш запрос быстрее.
При 30.000 записей в names - медленнее.

Если к запросам добавить ORDER BY rand() - все меняется.

Сейчас сижу и думаю где, что и как в конфиге сервера подкрутить, чтобы этот запрос быстрее выполнялся, т.к. из-за него скорость работы программы упала в 2-3 раза smile
PM MAIL   Вверх
Zloxa
Дата 10.12.2009, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



Цитата(AnemoN @  10.12.2009,  11:45 Найти цитируемый пост)
чтобы этот запрос быстрее выполнялся

Да, поиск по невхождению да неравенству - емок ;)
При проектировании таких поисков лучше б избегать.


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


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


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

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



Цитата(AnemoN @  10.12.2009,  12:45 Найти цитируемый пост)
Сейчас проверил оба запроса к бд 

А какие индексы на таблицах? а какие индексы используются? лучше бы вместо абстрактного быстрее/медленнее дал бы планы запросов. И полные структуры таблиц. Тогда это было бы показательно.


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

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


Чо?
****


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

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



Akina, какие индексы могут быть использованы при отборе по неравенству?  smile 

Разве что джойн......

Но джойн по индексу тоже не выгодным должен быть, потому как мы полностью сканируем обе таблицы, а так еще и индекс придется полностью сканировать.



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


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


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

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



А где тут отбор по неравенству? и что потребует сканирования таблицы?


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

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


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


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

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



Цитата(Akina @  10.12.2009,  14:19 Найти цитируемый пост)
А где тут отбор по неравенству?


Цитата(AnemoN @  10.12.2009,  09:14 Найти цитируемый пост)
Необходимо составить запрос, который вернет names.nid, names.name, т.о. что не существует names_used.nid = names.nid или существует, но names_used.pid!=x


Цитата(AnemoN @  10.12.2009,  09:44 Найти цитируемый пост)
Большое вам спасибо, код идеально работает


Цитата(Gluttton @  10.12.2009,  10:24 Найти цитируемый пост)
Не за что, только я ошибся и вместо неравенства с переменной поставил критерий на равенство  ...


Я свой запрос уже подправил smile ...


--------------------
Слава Україні!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




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


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

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