![]() |
|
Задавайте вопросы, мы ответим
Вы не зашли.
С Новым годом.
Допустим, имеются две таблицы: "книги" (books) из трех столбцов (id, title, genre) и "жанры" (genres) из двух столбцов (id, name). Книги бывают одножанровые, а бывают и многожанровые, поэтому books.genre – поле, где вполне может быть перечислено что-то вроде "1,3,10", причем числа – указатели на genres.id
Предположим, что мы хотим найти книги, принадлежащие определенному жанру или группе жанров. С помощью какого запроса это осуществимо и осуществимо ли вообще? Понятно, что "SELECT title FROM books WHERE genre = $q" здесь не подойдет, т.к. сверка будет происходить по всей длине поля, а мне надо, чтобы "глядя" на запись "1,3,10" мистер мускул сумел определить, что в ней содержится число "1" или "3", а возможно одновременно "1" и "3" (в зависимости от того, хотим мы прочесать books по одному жанру или же по двум и более). Очевидно, проблема решаема с использованием регулярных выражений, но не будет ли это слишком круто при наличии в базе 10-20 тысяч наименований книг? У каждой проверять жанры посредством REGEXP...
Надеюсь, объяснил доступно. Может быть, это вообще глупая затея, хранить список жанров к каждой книге именно в таком виде, в котором я описываю? Может есть более оптимальный и разумный способ?
Спасибо.
Отредактированно RB (01.01.2009 05:24:29)
Неактивен

Вот гики сидят на форуме, а? Ну ладно - меня разбудили, но получить в такое время почту? ![]()
С новым годом ![]()
Обычно для обеспечения такой связи используют дополнительную табличку. Т.е. предлагаю
Вам сделать такую структуру:
books (id, title)
genres (id, names)
book_genres (book, genre, primary key (genre, book))
Тогда записи "1,3,10" оригинальных данных будут соответствовать 3 строки новой таблицы.
А Выборка будет происходить, разумеется, простым JOIN
Неактивен
Благодарю. Кратко, компетентно, доступно. Thanx ![]()
Пойду спать... ![]()
Неактивен
Возник вопрос!
Почему мы определяем Primary Key сразу для двух полей?
Неактивен

Он обеспечивает уникальность строк. Чтобы одна и та же книга не принадлежала одному
и тому же жанру дважды. Порядок выбран для скорости поиска (при поиске всегда
используется сначала первый столбец, а потом уже второй - если нужно).
P.S. Интересно, как меня угораздило заалиасить genres в j, а не в g? ![]()
Неактивен
Наконец-то попробовал организовать подобную структуру. Вроде все работает. Поначалу попробовал вывести все жанры к произвольно выбранной книге. Попытка увенчалась успехом. Правда, при этом я не использовал в запросе слово JOIN...
book (id, title, primary key (id))
genre (id, name, primary key (id))
linkGenre (book, genre, primary key (book, genre))
Отредактированно RB (02.01.2009 20:28:03)
Неактивен

Запятая эквивалентна JOIN
Неактивен