SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 11.02.2012 20:12:59

Raulph
Участник
Зарегистрирован: 12.12.2011
Сообщений: 18

множественный запрос по трем таблицам ("многие- ко- многим") как?

Здравствуйте!
Очень прошу прощения, (уверен) должно быть на форуме где-то уже спрашивали и отвечали - но не могу найти уже несколько дней. Сильно не пинайте, я в муське новичок - новее некуда)

Задачка чуть ли не из учебника:

таблица1(открытки)
id_1        name
1             открытка1
2             открытка2
3             открытка3
4             открытка4
5             открытка5
.       
1000       открытка1000

таблица2(теги)
id_2          name
1              синяя
2              смешная
3              перфорация
4              винни пух
5              1май
.       
1000         валентинка

таблица3(связи)
id_1        id_2
1             1
1             4
1             493
2             3
2             21
и т.д.

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

я делал так:
$mass = "'валентинка','музыкальная',,,";


SELECT distinct * FROM
открытки AS t1
JOIN
связи AS t2
JOIN
теги AS t3 ON t1.id_1 = t2.id_2 AND t2.id_2 = t3.id_2 WHERE t3.name IN ($mass)


и делал так:

SELECT distinct * FROM открытки WHERE id_1 in (SELECT id_2 FROM связи WHERE ids in (SELECT id_2 FROM теги WHERE name in ($mass)))


Оба работают, Но находятся все открытки с "музыкой" и "валентинкой", то есть даже те где совпал только один тэг. (distinct не пашет)
Люди добрые! Что как это должно быть?!
Спасибо!

Отредактированно Raulph (11.02.2012 21:07:56)

Неактивен

 

#2 11.02.2012 20:33:22

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

select id_1 from `связи` t1 join
(select id_2 from `теги` where name in ($mass)) t2 on t1.id_2=t2.id_2 group by t1.id_1 having count(*)=N

где N - количество выбранных тегов, т.е. количество элементов в массиве $mass

Неактивен

 

#3 11.02.2012 21:06:38

Raulph
Участник
Зарегистрирован: 12.12.2011
Сообщений: 18

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

vasya написал:

select id_1 from `связи` t1 join
(select id_2 from `теги` where name in ($mass)) t2 on t1.id_2=t2.id_2 group by t1.id_1 having count(*)=N

где N - количество выбранных тегов, т.е. количество элементов в массиве $mass

Я не понимаю, а где же таблица 'открытки' (t3)?
и синтаксис то же не понятен.

select id_1 from `связи` as? t1 join
(select id_2 from `теги` where name in ($mass)) тут пусто? t2 on t1.id_2=t2.id_2 group by t1.id_1 having count(*)=N

Спасибо.

Неактивен

 

#4 11.02.2012 21:13:36

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

as - необязательное ключевое слово, поэтому, чтобы меньше на клавиатуру нажимать, я его пропускаю wink

Что касается имени открытки - так сделайте ещё один join. У вас ведь проблема была в том, что вы не могли найти id открытки, который удовлетворяет всем тегам - я показал как его получить.

Неактивен

 

#5 11.02.2012 21:20:00

Raulph
Участник
Зарегистрирован: 12.12.2011
Сообщений: 18

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

vasya написал:

as - необязательное ключевое слово, поэтому, чтобы меньше на клавиатуру нажимать, я его пропускаю wink
Что касается имени открытки - так сделайте ещё один join. У вас ведь проблема была в том, что вы не могли найти id открытки, который удовлетворяет всем тегам - я показал как его получить.

Пожалуйста! Не сочтите за наглость - напишите как это должно целиком быть и без пропусков .
Я, на данном этапе не соберу все сам, еще путаюсь что куда-куда идет (а то, мозг уже выкипает). Плииз!

Неактивен

 

#6 11.02.2012 21:27:23

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

select t.id_1, t.name from `открытки` as t join
(select id_1 from `связи` as t1 join
(select id_2 from `теги` where name in ($mass)) as t2 on t1.id_2=t2.id_2 group by t1.id_1 having count(*)=N) as t3 on t.id_1=t3.id_1;

Неактивен

 

#7 11.02.2012 21:58:10

Raulph
Участник
Зарегистрирован: 12.12.2011
Сообщений: 18

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

Огромное спасибо! буду разбирается. Пока - пустой экран, ни ошибок ни результата, но похожа это я чего-то напутал. Как добьюсь результата - отпишусь. Спасибо еще раз, главное принцип вроде понял!

Неактивен

 

#8 11.02.2012 22:05:54

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

Предположения:
1) вы указали слишком много тегов и открытки, которая им всем удовлетворяет не существует?
2) неправильно указали N?
3) проверяете сразу в скрипте или отдельно сам запрос в клиенте?

Неактивен

 

#9 11.02.2012 22:10:34

Raulph
Участник
Зарегистрирован: 12.12.2011
Сообщений: 18

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

Предположения:
1) 2 тега
2) N=2
3)в скрипте php (денвер)

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

Неактивен

 

#10 11.02.2012 22:21:29

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

Проверьте сначала запрос с вашими названиями в клиенте, в случае успеха ищите ошибку в php.

Неактивен

 

#11 11.02.2012 22:38:20

Raulph
Участник
Зарегистрирован: 12.12.2011
Сообщений: 18

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

>>MySQL returned an empty result set (i.e. zero rows). ( Query took 0.0018 sec )
Значит не php. Но без понятия - что тут не так)) Копаю дальше..

Неактивен

 

#12 11.02.2012 23:33:34

Raulph
Участник
Зарегистрирован: 12.12.2011
Сообщений: 18

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

Нет((  создал отдельную базу, там три таблицы book, teg, link. забил немного строк.
ввел в запросе так:


select t.id_1, t.name from book as t
join
(select id_1 from link as t1 join
(select id_2 from tegs where name in ('красная','синяя')) as t2 on t1.id_2=t2.id_2 group by t1.id_1 having count(*)=2) as t3 on t.id_1=t3.id_1
 


результат пусто и:
>>MySQL returned an empty result set (i.e. zero rows). ( Query took 0.0020 sec )
Что я не так делаю?

Отредактированно Raulph (11.02.2012 23:34:05)

Неактивен

 

#13 11.02.2012 23:48:35

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

mysql> select * from book;
+------+-------+
| id_1 | name  |
+------+-------+
|    1 | name1 |
|    2 | name2 |
|    3 | name3 |
|    4 | name4 |
+------+-------+
4 rows in set (0.00 sec)

mysql> select * from tegs;
+------+-------+
| id_2 | name  |
+------+-------+
|    1 | red   |
|    2 | blue  |
|    3 | green |
+------+-------+
3 rows in set (0.00 sec)

mysql> select * from link;
+------+------+
| id_1 | id_2 |
+------+------+
|    1 |    1 |
|    1 |    2 |
|    1 |    3 |
|    2 |    3 |
|    3 |    2 |
+------+------+
5 rows in set (0.00 sec)

mysql> select t.id_1, t.name from book as t
    -> join
    -> (select id_1 from link as t1 join
    -> (select id_2 from tegs where name in ('red','blue')) as t2 on t1.id_2=t2.
id_2 group by t1.id_1 having count(*)=2) as t3 on t.id_1=t3.id_1;
+------+-------+
| id_1 | name  |
+------+-------+
|    1 | name1 |
+------+-------+
1 row in set (0.03 sec)
 

Неактивен

 

#14 11.02.2012 23:49:54

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

Что у вас вернет
select id_2 from tegs where name in ('красная','синяя');

Неактивен

 

#15 12.02.2012 00:17:05

Raulph
Участник
Зарегистрирован: 12.12.2011
Сообщений: 18

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

vasya написал:

Что у вас вернет
select id_2 from tegs where name in ('красная','синяя');

Сорри - отходил.
все Ваши запрос - выводит нормально, кроме последнего (тройного). Там вернуло:  MySQL returned an empty result set (i.e. zero rows)


на

select id_2 from tegs where name in ('красная','синяя');

Вернуло
id-2
1
2


ps
CREATE TABLE IF NOT EXISTS `book` (
  `id_1` int(100) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id_1`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=6 ;


INSERT INTO `book` (`id_1`, `name`) VALUES
(1, 'книга джунглей'),
(2, 'кот в сапогах'),
(3, 'незнайка'),
(4, 'Пушкин сказки'),
(5, 'дюймовочка');



CREATE TABLE IF NOT EXISTS `link` (
  `id` int(100) NOT NULL AUTO_INCREMENT,
  `id_1` int(100) NOT NULL,
  `id_2` int(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=10 ;



INSERT INTO `link` (`id`, `id_1`, `id_2`) VALUES
(1, 1, 3),
(2, 1, 1),
(3, 2, 3),
(4, 2, 2),
(5, 3, 4),
(6, 4, 3),
(7, 4, 1),
(8, 5, 5),
(9, 5, 2);



CREATE TABLE IF NOT EXISTS `tegs` (
  `id_2` int(100) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id_2`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=6 ;



INSERT INTO `tegs` (`id_2`, `name`) VALUES
(1, 'красная'),
(2, 'синяя'),
(3, 'страшная'),
(4, 'смешная'),
(5, 'детектив');
 

Отредактированно Raulph (12.02.2012 00:32:47)

Неактивен

 

#16 12.02.2012 00:33:47

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

Ну так у вас в таблице `link` не такого id_1, которому бы соответствовали id_2 со значениями 1 и 2 smile
Вот если бы вы выбрали красную и страшную smile


Кстати, зачем в таблице `link` `id` int(100) NOT NULL AUTO_INCREMENT ?

Неактивен

 

#17 12.02.2012 00:55:47

Raulph
Участник
Зарегистрирован: 12.12.2011
Сообщений: 18

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

Ура!!! ЗАРАБОТАЛО!!   
(тысяча извинений за мою невнимательность!)

про id в link'е - дык, был уверен что необходим уникальный индекс на таблицу, разве не обязателен?

Неактивен

 

#18 12.02.2012 01:08:05

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

Не обязателен. В данном случае не нужен.
Попробуйте привесьте пример в котором он понадобиться у этой таблицы.

Неактивен

 

#19 12.02.2012 01:10:52

Raulph
Участник
Зарегистрирован: 12.12.2011
Сообщений: 18

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

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

Неактивен

 

#20 12.02.2012 01:29:13

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

Raulph написал:

Возможно базу заново завести придется...

Лучше с существующей разобраться, а то может войти в привычку каждый раз новую заводить wink
Проверяйте в клиенте; убедитесь, что существует открытка, удовлетворяющая указанному набору тегов; если не поможет, выполняйте запрос по частям, сначала внутреннюю (где формируется t2), затем ту, которая формирует t1, потом уже весь запрос.

Неактивен

 

#21 12.02.2012 01:50:20

Raulph
Участник
Зарегистрирован: 12.12.2011
Сообщений: 18

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

убедитесь, что существует открытка -есть 100%
запрос по частям:
сначала внутреннюю (где формируется t2) - все ок
та которая формирует t1,                         - все ок
весь запрос                                            - Нету. MySQL returned an empty result ((

Неактивен

 

#22 12.02.2012 02:21:46

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

Т.е.

select id_1 from `связи` as t1 join
(select id_2 from `теги` where name in ($mass)) as t2 on t1.id_2=t2.id_2 group by t1.id_1 having count(*)=N
возвращает результат

А
select t.id_1, t.name from `открытки` as t join
(select id_1 from `связи` as t1 join
(select id_2 from `теги` where name in ($mass)) as t2 on t1.id_2=t2.id_2 group by t1.id_1 having count(*)=N) as t3 on t.id_1=t3.id_1;
нет?

Неактивен

 

#23 12.02.2012 02:27:25

Raulph
Участник
Зарегистрирован: 12.12.2011
Сообщений: 18

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

select id_1 from `связи` as t1 join
(select id_2 from `теги` where name in ($mass)) as t2
возвращает результат

а
select id_1 from `связи` as t1 join
(select id_2 from `теги` where name in ($mass)) as t2 on t1.id_2=t2.id_2 group by t1.id_1 having count(*)=N
уже - пусто

Неактивен

 

#24 12.02.2012 02:37:32

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

Приведите результат и сам запрос с заменой $mass на конкретные значения

select id_1 from `связи` as t1 join
(select id_2 from `теги` where name in ($mass)) as t2 on t1.id_2=t2.id_2

Неактивен

 

#25 12.02.2012 02:40:00

Raulph
Участник
Зарегистрирован: 12.12.2011
Сообщений: 18

Re: множественный запрос по трем таблицам ("многие- ко- многим") как?

уже. я все запросы делаю через phpMyAdmin. В общем - да, всегда конкретные существующие и перекрещивающееся значения.

select idrec from link as t1 join
(select ids from tegs where name in ('красный','быстрый')) as t2 on t1.idrec=t2.ids  - "empty result"

Отредактированно Raulph (12.02.2012 02:53:58)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson