Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Выборка по нескольким значениям из одного поля


Автор: Serebrus 19.5.2011, 08:37
Привет всем.
Есть две таблицы: основной и подчиненный (как обычно).
Первый table1
id | full_name
____________
1 | tovar1
2 | tovar2
3 | tovar3
4 | tovar4
5 | tovar5

Второй table2
id | buyer_id | t_count | t_id
________________________
1 |     1        |    10     |  1
2 |     1        |    15     |  2
3 |     1        |    10     |  4
4 |     2        |    30     |  2
5 |     2        |    30     |  4
6 |     3        |    20     |  4
...
Надо составить список покупателей, тех кто купили выбранные пользователем товары
Для этого:
Код

select * from table2 where t_id=2 and t_id=4 --Это при выборе 2- и 4-товара

но этот селект не дает результат (т.е. пустой)
в чем может быть проблема?

Автор: Zloxa 19.5.2011, 08:43
Вы подумайте как товар одновременно может быть апельсином и абрикосом?  Это ведь абсурдно.
Вам нужно выбрать товары елси они являются апельсинами или абрикосами.

Автор: Akina 19.5.2011, 08:46
Цитата(Serebrus @  19.5.2011,  09:37 Найти цитируемый пост)
в чем может быть проблема? 

В голове. Твой запрос делает вовсе не то, что ты хочешь. Он пытается найти строку, в которой t_id равно и 2, и 4, причём ОДНОВРЕМЕННО.

Цитата(Serebrus @  19.5.2011,  09:37 Найти цитируемый пост)
Надо составить список покупателей, тех кто купили выбранные пользователем товары

Эту фразу можно интерпретировать как минимум двумя принципиально разными способами.
Сформулируй так, чтобы не осталось неоднозначности.

Автор: Serebrus 19.5.2011, 08:48
Да, вы правы, как написать селект правильно?
Если пользоваться IN, то в результат этого селекта добавится и пользователь под номером 3, т.е. если:
Код

select * from table2 where t_id in (2,4) --Это при выборе 2- и 4-товара

Автор: Akina 19.5.2011, 09:04
Цитата(Serebrus @  19.5.2011,  09:48 Найти цитируемый пост)
как написать селект правильно?

Читать умеешь? перечитай ещё раз:

Цитата(Akina @  19.5.2011,  09:46 Найти цитируемый пост)
Эту фразу можно интерпретировать как минимум двумя принципиально разными способами.
Сформулируй так, чтобы не осталось неоднозначности. 


Автор: Serebrus 19.5.2011, 11:12
если все знают все (а такое вообще не реально, кроме БОГа), то зачем тогда форум, люди заходят узнать то что не знают, все же не такие как Вы Akina, зачем такие слова

Если знаете решение, то помогите пожалуйста, если нет то ...

Автор: Akina 19.5.2011, 11:20
Цитата(Serebrus @  19.5.2011,  12:12 Найти цитируемый пост)
Если знаете решение, то помогите пожалуйста

Я не знаю задачи. Вы её сформулировать однозначно до сих пор не удосужились. Хотя я уже перестал просить Вас сделать это в форме вежливой, и начал - в грубой.
Если формулировки задачи так и не последует - ждите того, кто согласен гадать на кофейной гуще и предлагать варианты в надежде, что один из них окажется тем, что нужен.

Автор: Serebrus 19.5.2011, 12:01
А что имеено Вам не понятно, мне надо список тех людей, кто одновременно купил и товар1, товар2,...
В программе список всех товаров (в CheckListBox), вы выбираете хотя бы один товар, а программа должна вам дать список, кто купил выбранный или выбранные вами товары.

Автор: Akina 19.5.2011, 14:58
Цитата(Serebrus @  19.5.2011,  13:01 Найти цитируемый пост)
мне надо список тех людей, кто одновременно купил и товар1, товар2,...

О! уже лучше... Рассказываю по шагам.

Вариант первый, тривиальный.

Берём и получаем список тех, кто покупал товар t_id=2
Код

select buyer_id from table2 where t_id=2

Анальногично тех, кто покупал товар t_id=4
Код

select buyer_id from table2 where t_id=4

Теперь выбираем тех, кто фигурирует и в том, и в другом списке
Код

select q1.buyer_id
from
(
select t1.buyer_id from table2 t1 where t1.t_id=2
) q1
join
(
select t2.buyer_id from table2 t2 where t2.t_id=4
) q2
on q1.buyer_id=q2.buyer_id


Или более сложный, но и более универсальный, вариант логики:

Выбираем всех, кто покупал товары 2 или 4
Код

select distinct buyer_id, t_id from table2 where t_id in (2,4)


Выбираем тех, кто в полученном списке фигурирует дважды

Код

select q1.buyer_id
from
(
  select distinct t1.buyer_id, t1.t_id from table2 t1 where t1.t_id in (2,4)
) q1
group by q1.buyer_id
having count (q1.t_id)=2


Автор: Zloxa 19.5.2011, 15:05
Цитата(Akina @  19.5.2011,  14:58 Найти цитируемый пост)
select q1.buyer_id
from
(
select t1.buyer_id from table2 t1 where t1.t_id=2
) q1
join
(
select t2.buyer_id from table2 t2 where t2.t_id=2
) q2
on q1.buyer_id=q2.buyer_id

 smile 
Код

select distinct t1.buyer_id
from  table2 t1, table2 t2
where t1.buyer_id=t2.buyer_id
   and t1.t_id=2
   and t2.t_id=2

Автор: Akina 19.5.2011, 15:13
ВНИМАНИЕ! код в http://forum.vingrad.ru/index.php?showtopic=329772&view=findpost&p=2349057 исправлен!

Zloxa, ты фактически выполнил работу парсера и оптимизатора smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)