- как известно, многие фильмы относятся одновременно к нескольким жанрам (например, триллер + драма); в идеале при выборе жанра триллер или драма пользователю выдается в результатах этот фильм
Первая таблица содержит в себе два столбца: с номером айди и названием жанра (id, janr). Вторая таблица (films) хранит айди, описание фильма и жанр. Естественно, во второй таблице будет содержаться числовое значение (в поле gkino), отвечающее за принадлежность фильма к тому или иному жанру. Но так как жанров может оказаться много, то возникает проблема с выводом данных из базы.
Весь код смысла нет вставлять, поэтому только самое важное:
if (isset($_GET['g'])) {$g = $_GET['g'];}
$result_filmgenre = mysql_query("SELECT * FROM films WHERE gkino='$g'",$link);
Данный пример замечательно выводит данные, когда фильм относится к одному жанру. А если сразу к двум, то ничего не получается, я затрудняюсь доработать этот запрос. Помогите.
Спустя 3 минуты, 55 секунд (28.07.2010 - 21:22) Rand написал(а):
SELECT * FROM films WHERE gkino='жанр1' OR gkino='жанр2'
или так
SELECT * FROM films WHERE gkino IN ('жанр1','жанр2','жанр3')
Спустя 6 минут, 30 секунд (28.07.2010 - 21:29) SarPHP написал(а):
Rand, так нельзя. Поясню: переменная $g заранее не определена (значение передается методом гет), поэтому оператор OR тут не поможет. Как ты видишь мой запрос вместе с переменной $g?
if (isset($_GET['g'])) {$g = $_GET['g'];}
$result_filmgenre = mysql_query("SELECT * FROM films WHERE gkino='$g' OR ..... ",$link);
Спустя 1 минута, 34 секунды (28.07.2010 - 21:31) linker написал(а):
Во-первых, из второй таблицы с фильмами убрать поле gkino. Во-вторых, создать новую таблицу, которая содержала бы связь id жанра - id фильма. Тогда запрос выглядел бы примерно так
SELECT * FROM films as f
LEFT JOIN film2janr as fj ON fj.film_id = f.id AND fj.janr_id = $g
LEFT JOIN janr as j on j.id = fj.janr_id
Спустя 4 минуты, 40 секунд (28.07.2010 - 21:35) Rand написал(а):
Можно всё. Часть запроса надо формировать динамически. Используй IN. В отдельной переменной формируй строку - часть запроса, которая должна находится внутри скобок после IN. А потом вставляй эту переменную в запрос.
Было бы удобно, если бы ты передавал id жанров в массиве, например genre[]. Тогда:
Было бы удобно, если бы ты передавал id жанров в массиве, например genre[]. Тогда:
$g=implode(",", $genre);
$result_filmgenre = mysql_query("SELECT * FROM films WHERE gkino IN(".$g.")",$link);
Спустя 15 минут, 59 секунд (28.07.2010 - 21:51) SarPHP написал(а):
Rand, смотри. Всего у меня 10 жанров в первой таблице. По твоему совету нужно создать переменную, содержащую в себе массив данных из этой таблицы. При получении массива, предлагаешь вместо жанр1, жанр2, жанр3 и т.д. подставлять значения массива: grow[0], grow[1], grow[2]. Если так, то как-то странно получается.
А как тогда данные будут храниться во второй таблице, в поле жанр? У меня сейчас там стоит везде по одному числу; если жанров будет три, то что, через запятую перечислять числа придется или через пробел или как (например: 2,3,5 или 2 3 5)?
А как тогда данные будут храниться во второй таблице, в поле жанр? У меня сейчас там стоит везде по одному числу; если жанров будет три, то что, через запятую перечислять числа придется или через пробел или как (например: 2,3,5 или 2 3 5)?
Спустя 8 минут, 39 секунд (28.07.2010 - 22:00) Rand написал(а):
Извеняюсь, не правильно прочитал суть вопроса.
Тогда вариант linker вполне жизнеспособен - создать ещё одну таблицу с двумя полями id-жанра+id-фильма.

Спустя 21 секунда (28.07.2010 - 22:00) linker написал(а):
SarPHP
Читай, что я тебе написал. Банальная ситуация для бд - связь один ко многим.
Читай, что я тебе написал. Банальная ситуация для бд - связь один ко многим.
Спустя 3 минуты, 1 секунда (28.07.2010 - 22:03) SarPHP написал(а):
Rand, ничего страшного, всё равно спасибо за помощь, наоборот на пользу пойдет мне
linker, для кого-то банально, а для кого-то вновинку
я попробую и отпишусь, благодарю

linker, для кого-то банально, а для кого-то вновинку

Спустя 5 минут, 33 секунды (28.07.2010 - 22:09) linker написал(а):
Я мог ошибиться, спать охота, а посему правленный вариант
SELECT * FROM films AS f
LEFT JOIN film2janr AS fj ON fj.janr_id = $g
LEFT JOIN janr AS j ON j.id = fj.janr_id
WHERE f.id = fj.film_id
Спустя 2 месяца, 9 дней, 15 часов, 41 минута, 36 секунд (8.10.2010 - 13:50) SarPHP написал(а):
SELECT * FROM films AS f
LEFT JOIN film2janr AS fj ON fj.janr_id = $g
LEFT JOIN janr AS j ON j.id = fj.janr_id
WHERE f.id = fj.film_id
Сделал всё как ты сказал, создал новую таблицу, вставил в нее нужные данные, отредактировал запрос, но ничего не выводится.
Еще была ошибка в запросе, переменную $g взял в одинарные кавычки, но это тоже не помогло.
Посмотри, может в чем-то другом ошибка? Разницы нет что использовать, ON или USING?
Спустя 40 минут, 5 секунд (8.10.2010 - 14:30) linker написал(а):
Ошибки в запросе нет однозначно, поставь обработку ошибки при выполнении данного запроса аля
mysql_query("текст запроса") or die(mysql_error());
Спустя 10 минут, 56 секунд (8.10.2010 - 14:41) SarPHP написал(а):
Вообще, вылазиет ошибка
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/p4567/www/sitename/g.php:1) in /home/p4567/www/sitename/inc/php_panel.php on line 7
В документе php_panel.php на 7 строке стоит старт сессии: session_start();
Вставил mysql_query("ТВОЙ ЗАПРОС") or die(mysql_error()); - ничего не произошло, страница загрузилась без ошибок, но вывод нужных фильмов не произошел.
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/p4567/www/sitename/g.php:1) in /home/p4567/www/sitename/inc/php_panel.php on line 7
В документе php_panel.php на 7 строке стоит старт сессии: session_start();
Вставил mysql_query("ТВОЙ ЗАПРОС") or die(mysql_error()); - ничего не произошло, страница загрузилась без ошибок, но вывод нужных фильмов не произошел.
Спустя 14 минут, 5 секунд (8.10.2010 - 14:55) SarPHP написал(а):
Заработало, после того как в конце запроса убрал сортировку "ORDER BY id DESC, id LIMIT $perv, $col". Это уже мой косяк
СпасибО!
- Разобрался, исправил сортировку на: "ORDER BY f.id DESC, f.id LIMIT $perv, $col"
Но по прежнему после редактирования запроса вылазиет ошибка:
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/p4567/www/sitename/g.php:1) in /home/p4567/www/sitename/inc/php_panel.php on line 7

СпасибО!

- Разобрался, исправил сортировку на: "ORDER BY f.id DESC, f.id LIMIT $perv, $col"
Но по прежнему после редактирования запроса вылазиет ошибка:
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/p4567/www/sitename/g.php:1) in /home/p4567/www/sitename/inc/php_panel.php on line 7
Спустя 1 час, 17 минут, 6 секунд (8.10.2010 - 16:13) linker написал(а):
Где-то у тебя вывод идет до выполнения session_start(), либо в самом начале перед <?php есть пробел(ы), либо BOM если используется utf-8. Заверни session_start() в самое начало скрипта
<?
session_start();
Спустя 41 минута, 10 секунд (8.10.2010 - 16:54) SarPHP написал(а):
UTF-8, поэтому BOM.. Редактировал код в обычном редакторе, потом воспользовался нотпадом и всё наладилось. Сам бы ни за что не догнал, что обычный виндосовский редактор добавляет сигнатуру.. такой сволочуга.

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