Задавайте вопросы, мы ответим
Вы не зашли.
С Новым годом.
Допустим, имеются две таблицы: "книги" (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
Неактивен