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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите понять логику выборки с join, Выборка по нескольким значениям 
:(
    Опции темы
mahmud5
  Дата 6.5.2009, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Объекты
id_ob   name
400      unitaz
410      rakovina
420      dush

Параметры
id_param    id_ob
1                 400
2                 400
3                 410
4                 400
3                 400
2                 410

На входе 3 параметра (может быть произвольное количество) с id_param 1,2,4 т.е. эти айдишники удовлетворяют только объекту с id_ob 400. 
На входе 2 параметра с id_param 2,3 т.е. эти айдишники удовлетворяют двум объектам с id_ob 400 и id_ob 410. 
Подскажите пожалуйста, как мне составить запрос ?

Сори за корявость - совсем зеленый.  smile 
PM MAIL   Вверх
DimW
Дата 6.5.2009, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



что такое "вход" и "выход", и какой результат ожидаете получить?
PM MAIL ICQ   Вверх
mahmud5
Дата 6.5.2009, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

SELECT `o.name` FROM (`objects` o, `parameter` p) WHERE p.id_param = 3 AND p.id_ob = o.id_ob


Выведутся и unitaz и rakovina т.к. и там и там есть параметр с id_param=3

Как сделать запрос с несколькими значениями  id_param ?

Вариант 
Код

SELECT `o.name` FROM (`objects` o, `parameter` p) WHERE p.id_param = 2 AND p.id_param = 3 AND p.id_ob = o.id_ob

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


Эксперт
***


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

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



Цитата(mahmud5 @  6.5.2009,  12:09 Найти цитируемый пост)
Как сделать запрос с несколькими значениями  id_param ?

Код

SELECT o.name
  FROM (objects o, parameter p)
 WHERE (p.id_param = 2 OR p.id_param = 3)
   AND p.id_ob = o.id_ob;
   
--или

SELECT o.name
  FROM (objects o, parameter p)
 WHERE p.id_param in (2, 3)
   AND p.id_ob = o.id_ob;   




Цитата(mahmud5 @  6.5.2009,  11:50 Найти цитируемый пост)
Параметры
id_param    id_ob
1                 400
2                 400
3                 410
4                 400
3                 400
2                 410


у вас идентификатор параметров не уникальный, почему?


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


Новичок



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

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



Не уникальные, потому-что это сводная таблица 2х таблиц (характеристик параметров и объектов). 

БД не моя и структура ее полей и таблиц не моя, поэтому менять ничего не могу.

сама логика OR подразумевает ИЛИ одно или другое, но никак не вместе
Код

WHERE (p.id_param = 2 OR p.id_param = 3) AND p.id_ob = o.id_ob;  


я так догадываюсь, тут надо создавать временную таблицу или делать какие-то вложенные запросы, чтобы выполнялось условие И

Код

WHERE p.id_param = 2 AND p.id_param = 3 AND p.id_ob = o.id_ob;  

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


Эксперт
***


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

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



Цитата(mahmud5 @  6.5.2009,  13:18 Найти цитируемый пост)
Не уникальные, потому-что это сводная таблица 2х таблиц (характеристик параметров и объектов). 

ясно.

Цитата(mahmud5 @  6.5.2009,  13:18 Найти цитируемый пост)
чтобы выполнялось условие И

если использовать И то запрос ничего не вернет т.к. одно поле не может содержать сразу 2 И 3, а только 2 ИЛИ 3.

Добавлено через 3 минуты и 3 секунды
Цитата(mahmud5 @  6.5.2009,  13:18 Найти цитируемый пост)
сама логика OR подразумевает ИЛИ одно или другое

да, но не исключат друг друга!
PM MAIL ICQ   Вверх
mahmud5
Дата 6.5.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



С OR выводятся все возможные варианты, т.е.
id_param = 2
id_param = 2 и id_param = 3
id_param = 3

а мне нужно только 
id_param = 2 и id_param = 3
PM MAIL   Вверх
DimW
Дата 6.5.2009, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

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


Новичок



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

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



Приведем другой пример

Авто (car)
id_car   name_car
1            ВАЗ
2            Феррари
3            Линкольн
4            Самосвал
5            Тойота

Технологии (tehnologi)
id_teh   name_teh
11           ABS
22           ГУР
33           EBD
44           Красная

Сводная таблица (teh-car)
id_teh    id_car
11          2
22          2
33          2
44          2
11          5
22          5
33          5
11          3
22          3

1 вариант 
Вывести все красные автомобили с ABS, EBD и ГУР
должно вывести только Феррари (у нее есть все 4 опции)

2 вариант
Вывести все авто с ASB и ГУР
должно вывести Феррари, Линкольн и Тойоту (у них у всех это есть)

3 вариант
Вывести все авто с ASB, ГУР и EBD
должно вывести Феррари и Тойоту (только у них есть эти 3 опции)



Это сообщение отредактировал(а) mahmud5 - 6.5.2009, 15:36
PM MAIL   Вверх
DimW
Дата 7.5.2009, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(mahmud5 @  6.5.2009,  15:35 Найти цитируемый пост)
1 вариант 
Вывести все красные автомобили с ABS, EBD и ГУР
должно вывести только Феррари (у нее есть все 4 опции)

Код

select car.name_car
  from [Авто] car
      ,[Сводная таблица] lnk1
      ,[Сводная таблица] lnk2
      ,[Сводная таблица] lnk3
      ,[Сводная таблица] lnk4
 where lnk1.id_car = car.id_car and ink1.id_teh = 44 -- красный авто
   and lnk2.id_car = car.id_car and ink2.id_teh = 11 -- ABS
   and lnk3.id_car = car.id_car and ink3.id_teh = 33 -- EBD
   and lnk4.id_car = car.id_car and ink4.id_teh = 22 -- ГУР


остальное по аналогии.


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


Новичок



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

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



DimW, спасибо тебе большое, очень выручил.

Жаль постов мало, накоплю - плюсану в репу.
PM MAIL   Вверх
DimW
Дата 7.5.2009, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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


 




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


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

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