Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Снова несколько условий в запросе. (число прочтений - 2914 )
BuZZZard
Full Member
***
Отсутствует



Сообщений: 112
Местоположение: Калининград
Зарегистрирован: 15. Октября 2007
Пол: Мужской
Снова несколько условий в запросе.
09. Июня 2009 :: 15:06
Печать  
Имею две таблицы:

------------
Элемент1
------------
Элемент2
------------

И подчиненная:

----------------------------------
Владелец | Имя | Значение |
----------------------------------
Элемент1 | Имя1 | 1            |
----------------------------------
Элемент2 | Имя1 | 1            |
----------------------------------
Элемент2 | Имя2 | 2            |
----------------------------------

Хочу получить владельцев, у которых:
Имя=Имя1 И Значение=1 И Имя=Имя2 И Значение=2
,т.е. в данном случае Элемент2.

Как такое реализовать? Буду благодарен за пример или хотя бы объяснение принципа построения такого запроса.
  
Наверх
ICQ  
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Снова несколько условий в запросе.
Ответ #1 - 09. Июня 2009 :: 16:38
Печать  
Код
Выбрать все
select
 Владелец
from
 ПодчиненнаяТаблица тб
inner join
 (
  select 'Имя1' Имя, 1 Значение union all
  select 'Имя2' Имя, 2 Значение
 ) vt on vt.Имя = тб.Имя and vt.Значение = тб.Значение
group by
 Владелец
having
 COUNT(vt.Имя) =2 

  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Снова несколько условий в запросе.
Ответ #2 - 09. Июня 2009 :: 18:31
Печать  
Код
Выбрать все
select Владелец
from ПодчиненнаяТаблица
where Имя = 'Имя1' and Значение = 1
	or Имя = 'Имя2' and Значение = 2
group by Владелец
having count(*) = 2 


Улыбка
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
BuZZZard
Full Member
***
Отсутствует



Сообщений: 112
Местоположение: Калининград
Зарегистрирован: 15. Октября 2007
Пол: Мужской
Re: Снова несколько условий в запросе.
Ответ #3 - 09. Июня 2009 :: 18:38
Печать  
berezdetsky писал(а) 09. Июня 2009 :: 18:31:
Код
Выбрать все
select Владелец
from ПодчиненнаяТаблица
where Имя = 'Имя1' and Значение = 1
	or Имя = 'Имя2' and Значение = 2
group by Владелец
having count(*) = 2 


Улыбка


OR не катит. Вариант OR я реализовал.

А что есть having count(*) = 2 ?
  
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Снова несколько условий в запросе.
Ответ #4 - 09. Июня 2009 :: 18:41
Печать  
На счёт "не катит" не скажу, но условиям из #0 этот запрос удовлетворяет.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
BuZZZard
Full Member
***
Отсутствует



Сообщений: 112
Местоположение: Калининград
Зарегистрирован: 15. Октября 2007
Пол: Мужской
Re: Снова несколько условий в запросе.
Ответ #5 - 09. Июня 2009 :: 18:48
Печать  
berezdetsky писал(а) 09. Июня 2009 :: 18:41:
На счёт "не катит" не скажу, но условиям из #0 этот запрос удовлетворяет.


у меня 3 И в условии. а тут 2 И и одно ИЛИ.
  
Наверх
ICQ  
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Снова несколько условий в запросе.
Ответ #6 - 09. Июня 2009 :: 18:53
Печать  
berezdetsky,
там фишка в том, что у Владельца должны быть обе записиПодмигивание

BuZZZard,
count(vt.Имя) = 2 - это кстати я тож неправильно написал, сорь. Должно быть =>2.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Снова несколько условий в запросе.
Ответ #7 - 09. Июня 2009 :: 18:55
Печать  
Код
Выбрать все
select Владелец
from (
		select 'Элемент1' Владелец, 'Имя1' Имя, 1 Значение
		union all select 'Элемент2', 'Имя1', 1
		union all select 'Элемент2', 'Имя2', 2
	) ПодчиненнаяТаблица
where Имя = 'Имя1' and Значение = 1
	or Имя = 'Имя2' and Значение = 2
group by Владелец
having count(*) = 2  


Ы?
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
BuZZZard
Full Member
***
Отсутствует



Сообщений: 112
Местоположение: Калининград
Зарегистрирован: 15. Октября 2007
Пол: Мужской
Re: Снова несколько условий в запросе.
Ответ #8 - 09. Июня 2009 :: 18:59
Печать  
berezdetsky писал(а) 09. Июня 2009 :: 18:55:
where Имя = 'Имя1' and Значение = 1 or Имя = 'Имя2' and Значение = 2
Ы?


Под это условие попадает и Элемент1 и Элемент2.
А нужен только Элемент2.
  
Наверх
ICQ  
IP записан
 
BuZZZard
Full Member
***
Отсутствует



Сообщений: 112
Местоположение: Калининград
Зарегистрирован: 15. Октября 2007
Пол: Мужской
Re: Снова несколько условий в запросе.
Ответ #9 - 09. Июня 2009 :: 18:59
Печать  
alexdd писал(а) 09. Июня 2009 :: 18:53:
berezdetsky,
там фишка в том, что у Владельца должны быть обе записиПодмигивание

BuZZZard,
count(vt.Имя) = 2 - это кстати я тож неправильно написал, сорь. Должно быть =>2.


А для чего это вообще?
  
Наверх
ICQ  
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Снова несколько условий в запросе.
Ответ #10 - 09. Июня 2009 :: 19:03
Печать  
berezdetsky,
а таки да, согласенУлыбка)

BuZZZard,
count(*)>=2 как раз и выдаст только тех Владельцев, для которых условие удоблетворяет более чем в двух строках
  
Наверх
 
IP записан
 
BuZZZard
Full Member
***
Отсутствует



Сообщений: 112
Местоположение: Калининград
Зарегистрирован: 15. Октября 2007
Пол: Мужской
Re: Снова несколько условий в запросе.
Ответ #11 - 09. Июня 2009 :: 19:26
Печать  
Ах вот оно что! Похоже это то, что нужно. Буду завтра пробовать.
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Снова несколько условий в запросе.
Ответ #12 - 10. Июня 2009 :: 04:32
Печать  
Код
Выбрать все
select  Эл from Табл1
where exists ( select * from ПодчиненнаяТаблица
		   where Табл1.id = ПодчиненнаяТаблица.Владелец
			   and ПодчиненнаяТаблица.Имя = Имя1
			   and ПодчиненнаяТаблица.Значение = 1 )
and
      exists ( select * from ПодчиненнаяТаблица
		   where Табл1.id = ПодчиненнаяТаблица.Владелец
			   and ПодчиненнаяТаблица.Имя = Имя2
			   and ПодчиненнаяТаблица.Значение = 2 )
 

  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Снова несколько условий в запросе.
Ответ #13 - 10. Июня 2009 :: 04:41
Печать  
еще вариант ( наверное лучше чем предыдущий )
Код
Выбрать все
select t1.Владелец from ПодчиненнаяТаблица t1
inner join from ПодчиненнаяТаблица t2
on t1.владелец = t2.Владелец
where t1.Имя = Имя1 and t1.Значение = 1
  and t2.Имя = Имя2 and t2.Значение = 2
 

  
Наверх
 
IP записан
 
BuZZZard
Full Member
***
Отсутствует



Сообщений: 112
Местоположение: Калининград
Зарегистрирован: 15. Октября 2007
Пол: Мужской
Re: Снова несколько условий в запросе.
Ответ #14 - 10. Июня 2009 :: 08:28
Печать  
Уже реализовал по предыдущему варианту. Вроде работает. Тестируем.

Всем большое спасибо!
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать