Вопрос к "мускулистым" парням!

12
malls
На сайте с 08.08.2005
Offline
255
1149

Как реализовать конструкцию:

WHERE IN (...)

чтобы она проверяла некоторые данные для двух полей по одному списку, при многотабличной выборке, т.е.:

SELECT * 

FROM first,second
WHERE /first.id,second.field/ IN (1,2,3,4)
[Удален]
#1

Прямо так в мускуле нельзя. Но вы лучше поясните что вы хотите получить, потому что даже если бы такое условие сработало, вы бы получили декартово произведение таблиц, просто слегка ограниченное.

malls
На сайте с 08.08.2005
Offline
255
#2
neolord:
Прямо так в мускуле нельзя. Но вы лучше поясните что вы хотите получить, потому что даже если бы такое условие сработало, вы бы получили декартово произведение таблиц, просто слегка ограниченное.

Прямо так нельзя - через AND тоже не работает.

Есть три таблицы:

first.id

first.value

second.id

second.id_from_first

second.value

third.id

third.id_from_first

third.value

Т.е. вторая и третья хранят свои данные "привязанные" к первой. В результате работы скрипта получаются некоторые выборочные значения first.id (не вся таблица, а выборка)

Задача выбрать все данные из 2-й и 3-й таблиц одним запросом используя именно этот список значений.

N
На сайте с 06.05.2007
Offline
419
#3

malls, декартово произведение это то же что и join. сцепите таблицы, а потом уже через and накладывайте еще фильтры.

Кнопка вызова админа ()
malls
На сайте с 08.08.2005
Offline
255
#4
netwind:
malls, декартово произведение это то же что и join. сцепите таблицы, а потом уже через and накладывайте еще фильтры.

Я пытался разобраться с JOIN - но не врубился.

Можете привести пример кода для описанного случая.

N
На сайте с 06.05.2007
Offline
419
#5

SELECT *

FROM first,second,third

WHERE

/* это объединение */

first.id=second.id and first.id=third.id

and

/* а это условия фильтрации */

first.value IN (1,2,3,4) and second.value in (1,2,3,4) ;

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

malls
На сайте с 08.08.2005
Offline
255
#6

first.value IN (1,2,3,4) and second.value in (1,2,3,4) ;

так как раз не работает, тоже.

только у меня задача другая, вот так я пробовал:

second.id_from_first IN (1,2,3,4) and third.id_from_first in (1,2,3,4) ;

[Удален]
#7

Насчет декартова я бы поспорил. При указании хоть одного параметра "фильтрации", а точнее параметра склейки - получается сечение, а без оных - чистое произведение.

Так вот. malls, опишите задачку поконкретнее.

Допустим вам надо объединить три таблицы - вуаля

select ... from t1,t2,t3...

where t1.field1=t2.field2 and t2.field3=t3.field4 and..

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

а дальше прицепляйте свое условие, только вот я так и не понял что за условие должно быть. Тупо из пересечения таблиц выбрать те где пара полей в заданном диапазоне? Если эти поля не участвуют в пересечении, то конструкция, которую вы писали, должна работать. Если участвуют - то между ними OR, все и к общему условию цеплять по AND.

Вас можно понять и иначе - может вы добиваетесь

select ... from t1

where field1 in (1,2,3)

union

select ... from t2

where field2 in (1,2,3)

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

N
На сайте с 06.05.2007
Offline
419
#8

да, декартово произведение я попутал.

из объяснений непонятно что за условие там ставить. то ли OR, то ли AND.

[Удален]
#9
malls:
Как реализовать конструкцию:
WHERE IN (...)
чтобы она проверяла некоторые данные для двух полей по одному списку, при многотабличной выборке, т.е.:
SELECT * 
FROM first,second
WHERE /first.id,second.field/ IN (1,2,3,4)
SELECT *
FROM first, second
WHERE first.id = second.field
AND first.id IN (1,2,3,4)

ps: угадал?

зыы:

Вас можно понять и иначе - может вы добиваетесь
select ... from t1
where field1 in (1,2,3)
union
select ... from t2
where field2 in (1,2,3)
тока тогда выбираемые поля должны совпадать по количеству, и типу с учетом порядка

если нужно такое, лучше разделить на 2 запроса

[Удален]
#10
MOP1:

если нужно такое, лучше разделить на 2 запроса

тут и есть два запроса =)

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий