сложный запрос

clevel

Новичок
сложный запрос

есть таблица def:

id| variable | content
----------------------
1 | 3000 | 5
----------------------
1 | 3001 | 12
----------------------
1 | 3002 | 7
----------------------
2 | 3000 | 5
----------------------
2 | 3001 | 12
----------------------
2 | 3002 | 7
----------------------
3 | 3000 | 3
----------------------
3 | 3004 | 4
----------------------
3 | 3005 | 8
----------------------

Необходимо: зная первичный id(например, 1) найти номера вторичных id, у которых бы совпадали все
variable,content c variable,content первичного id. В данном примере должен выдать вторичный id=2.
 

su1d

Старожил PHPClubа
SELECT DISTINCT d1.id FROM def d1 INNER JOIN def d2 USING(variable, content) WHERE d2.id = 1 AND d1.id <> d2.id;
 

clevel

Новичок
Не получается... в чем не устраивает результат выборки:
1.мускул должен проверять, чтобы variable для id=1, а именно
3000,3001,3002, присутствовали в искомом id, и других variable, например 3004, там не было.
2.Для каждого variable id=1 и искомого id совпадали content, то есть variable 3000, content 5 id=1-> variable 3000, content 5, id=2.
А он мне начинает выдавать кучу левых id, у которых разное кол-во variable, не совпадающих с искомым id, а также не совпадают content
 

Demiurg

Guest
например ? каких левых ?

PS прозе сделать так: WHERE d1.id <> 1;
 

clevel

Новичок
выдает id,в которых variable отличные от тех, которые в id=1, а надо, чтобы они были ИДЕНТИЧНЫЕ+ значения content для этих variable должны СОВПАДАТЬ.
Он мне начинает выдавать практически все id, где встречаются те или иные variable, а мне надо только те, где будут только variable. указанные в id=1 и content для каждого variable будет совпадать
 

clevel

Новичок
table def: id,owner,variable,content

9|2|453|2000
9|2|452|1000
9|2|451|319
9|2|450|219
8|1|5201|23
8|1|3503|3003
8|1|3502|3000
8|1|19|6
8|1|25|40
8|1|27|22
8|1|3502|3000
8|1|3503|3003
9|2|454|500
9|2|455|550
9|2|456|600
0|1|3503|3001
0|1|3502|3000
0|1|5201|21
0|1|27|20
0|1|3503|3003
0|1|3502|3000
20|1|25|40
20|1|19|6
20|1|3503|3005
20|1|3502|3000
0|1|5201|23
0|1|27|22
0|1|3503|3003
0|1|3502|3000
0|1|25|40
0|1|19|6
0|1|3503|3005
0|1|3502|3000
0|1|5201|23
0|1|27|22
0|1|3503|3003
0|1|3502|3000
0|1|3503|3001
0|1|3502|3000
19|2|456|600
19|2|455|550
19|2|454|500
19|2|453|2000
19|2|452|1000
19|2|451|319
19|2|450|219
17|1|25|40
17|1|19|6
18|1|3503|3001
18|1|3502|3000
17|1|5201|5102
17|1|27|5001
17|1|3503|3003
17|1|3502|3000
16|1|25|40
16|1|19|6
16|1|3503|3005
16|1|3502|3000

на запрос, где id=20 выдает 8,0,17,16,18, хотя должен выдавать только 16
 

Demiurg

Guest
20|1|3502|3000
8|1|3502|3000
0|1|3502|3000
17|1|3502|3000
16|1|3502|3000
18|1|3502|3000
как видишь все нормально ...
а с where я облажался...
 

clevel

Новичок
я тут поюзал и понял, где камень преткновения...
мускул проверяем, есть ли хотя бы одно значение variable, которое совпадает. Если есть, то id добавляем в список результата.
А мне надо, Чтобы id выводило при условии, что ВСЕ variable есть, и только ОНИ. ЧТо-То вроде variable IN(..), только ничего кроме того, что указано в IN()
 

clevel

Новичок
Автор оригинала: Demiurg
20|1|3502|3000
8|1|3502|3000
0|1|3502|3000
17|1|3502|3000
16|1|3502|3000
18|1|3502|3000
как видишь все нормально ...
а с where я облажался...
Да. но надо, чтобы не только 3502, но и 19, 25 и 3503, и в случае, если есть только они... по этому критерию все id кроме 16 не подходят. при этом надо и про content не забыть
 

Demiurg

Guest
тогда примерно так.
select @cnt = count(*) from table where id = 20
select id , count(*) cont from a , b
where a.id = 20 and a.variable = b.variable and a.content = b.content and b.id<>20
group by id
having cont = @cnt
 

clevel

Новичок
Автор оригинала: Demiurg
тогда примерно так.
select @cnt = count(*) from table where id = 20
select id , count(*) cont from a , b
where a.id = 20 and a.variable = b.variable and a.content = b.content and b.id<>20
group by id
having cont = @cnt
а что такое @cnt и что такое cont?
как я понял, ты предлагаешь два запроса?
я могу средствами пхп без запроса в БД узнать:
1.variable IN(..) для id=20
2.кол-во variable для id=20
 

clevel

Новичок
на запрос
select `copy`.`id` , count(*) cont
from `kdef`, `kdef` copy
where `kdef`.`id` = 20
and `kdef`.`variable` = `copy`.`variable`
and `kdef`.`content` = `copy`.`content`
and `copy`.`id`<>20
group by `copy`.`id`
having cont = 4

выдает id 8,16 - уже лучше, однако возникают вопросы:
1.если в id нужное количество variable, однако не все из них совпадают с эталоном. Как я понимаю,
and `kdef`.`variable` = `copy`.`variable`
and `kdef`.`content` = `copy`.`content`
проверяет на ОДНО и БОЛЕЕ совпадений, но НЕ НА ВСЕ
2. в id=8 намного больше значений, чем 4, однако мускул пишет 8 и кол-во 4
 

clevel

Новичок
кстати, а что обозначаеи значек напротив моей темы, отдаленно напоминающий фотоаппарат? у всех почтовые конверты, а у меня что-то другое, причем не в первый раз уже...
 

Demiurg

Guest
8ка появилась от того, что у тебя повторяются записи, я как то на это не обратил внимания.
сделай count(distinct variable , content) вместо count(*). Должно сработать.

ЗЫ а зачем ты везеде эти апострафы ставишь ?
 

clevel

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

count(distinct variable , content) ругаеться мускул...Column: 'variable' in field list is ambiguous
 

clevel

Новичок
сделай count(distinct variable , content) вместо count(*). Должно сработать
select `copy`.`id` , count(distinct `copy`.`variable` , `copy`.`content`) cont
from `kdef`, `kdef` copy
where `kdef`.`id` = 20
and `kdef`.`variable` = `copy`.`variable`
and `kdef`.`content` = `copy`.`content`
and `copy`.`id`<>20
group by `copy`.`id`
having cont = 4

выдает 0,16 - странно, откуда ноль вылез
 

Demiurg

Guest
Так для id=0 есть все записи, которые есть для id = 20.
в апострафы надо брать только зерезервированые слова.
 
Сверху