Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1 2
Здравствуйте!
Очень прошу прощения, (уверен) должно быть на форуме где-то уже спрашивали и отвечали - но не могу найти уже несколько дней. Сильно не пинайте, я в муське новичок - новее некуда)
Задачка чуть ли не из учебника:
таблица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 = "'валентинка','музыкальная',,,";
Отредактированно Raulph (11.02.2012 21:07:56)
Неактивен
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
Неактивен
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
Спасибо.
Неактивен
as - необязательное ключевое слово, поэтому, чтобы меньше на клавиатуру нажимать, я его пропускаю
Что касается имени открытки - так сделайте ещё один join. У вас ведь проблема была в том, что вы не могли найти id открытки, который удовлетворяет всем тегам - я показал как его получить.
Неактивен
vasya написал:
as - необязательное ключевое слово, поэтому, чтобы меньше на клавиатуру нажимать, я его пропускаю
Что касается имени открытки - так сделайте ещё один join. У вас ведь проблема была в том, что вы не могли найти id открытки, который удовлетворяет всем тегам - я показал как его получить.
Пожалуйста! Не сочтите за наглость - напишите как это должно целиком быть и без пропусков .
Я, на данном этапе не соберу все сам, еще путаюсь что куда-куда идет (а то, мозг уже выкипает). Плииз!
Неактивен
Неактивен
Огромное спасибо! буду разбирается. Пока - пустой экран, ни ошибок ни результата, но похожа это я чего-то напутал. Как добьюсь результата - отпишусь. Спасибо еще раз, главное принцип вроде понял!
Неактивен
Предположения:
1) вы указали слишком много тегов и открытки, которая им всем удовлетворяет не существует?
2) неправильно указали N?
3) проверяете сразу в скрипте или отдельно сам запрос в клиенте?
Неактивен
Предположения:
1) 2 тега
2) N=2
3)в скрипте php (денвер)
я похоже попал в яму которую сам выкопал - для пример я использовал невымышленные названия столбцов и таблиц. Видимо, конвертируя Ваш пример, я где-то не так заменил название на свое. Хотя вот уже все проверил раз десять, ну не вижу где ошибка!
Неактивен
Проверьте сначала запрос с вашими названиями в клиенте, в случае успеха ищите ошибку в php.
Неактивен
>>MySQL returned an empty result set (i.e. zero rows). ( Query took 0.0018 sec )
Значит не php. Но без понятия - что тут не так)) Копаю дальше..
Неактивен
Нет(( создал отдельную базу, там три таблицы book, teg, link. забил немного строк.
ввел в запросе так:
Отредактированно Raulph (11.02.2012 23:34:05)
Неактивен
Неактивен
Что у вас вернет
select id_2 from tegs where name in ('красная','синяя');
Неактивен
vasya написал:
Что у вас вернет
select id_2 from tegs where name in ('красная','синяя');
Сорри - отходил.
все Ваши запрос - выводит нормально, кроме последнего (тройного). Там вернуло: MySQL returned an empty result set (i.e. zero rows)
на
Отредактированно Raulph (12.02.2012 00:32:47)
Неактивен
Ну так у вас в таблице `link` не такого id_1, которому бы соответствовали id_2 со значениями 1 и 2
Вот если бы вы выбрали красную и страшную
Кстати, зачем в таблице `link` `id` int(100) NOT NULL AUTO_INCREMENT ?
Неактивен
Ура!!! ЗАРАБОТАЛО!!
(тысяча извинений за мою невнимательность!)
про id в link'е - дык, был уверен что необходим уникальный индекс на таблицу, разве не обязателен?
Неактивен
Не обязателен. В данном случае не нужен.
Попробуйте привесьте пример в котором он понадобиться у этой таблицы.
Неактивен
не в смысле - практичное значение, а как необходимое условие для любой таблицы. Понял - значит не необходим. Пытаюсь понять почему с моей базой не заработало. Возможно базу заново завести придется...
Неактивен
Raulph написал:
Возможно базу заново завести придется...
Лучше с существующей разобраться, а то может войти в привычку каждый раз новую заводить
Проверяйте в клиенте; убедитесь, что существует открытка, удовлетворяющая указанному набору тегов; если не поможет, выполняйте запрос по частям, сначала внутреннюю (где формируется t2), затем ту, которая формирует t1, потом уже весь запрос.
Неактивен
убедитесь, что существует открытка -есть 100%
запрос по частям:
сначала внутреннюю (где формируется t2) - все ок
та которая формирует t1, - все ок
весь запрос - Нету. MySQL returned an empty result ((
Неактивен
Т.е.
Неактивен
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
уже - пусто
Неактивен
Приведите результат и сам запрос с заменой $mass на конкретные значения
Неактивен
уже. я все запросы делаю через 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)
Неактивен
Страниц: 1 2