Задавайте вопросы, мы ответим
Вы не зашли.
Всех приветствую!
Разрабатывая свой сайт задался одним, на мой взгляд, интересным вопросом. Есть ли в MySQL возможность выбора определенной таблицы из числа других по определенному критерию?
Например, есть 3-4 таблицы, в которых есть по одному одинаковому полю, но значения полей разные. Так вот я хочу выбрать все поля таблицы по конкретному значению ее поля.
Запрос мой возможно будет выглядеть так:
SELECT * WHERE fieldname='1', где:
* - количество всех имеющихся таблиц в БД;
fieldname - название поля, которое имеется во всех таблицах;
'1' - значение поля, по которому и происходит выборка определенной таблицы;
Данный запрос конечно утрирован и не корректен, т.к. я не знаю как написать его правильно, но суть моей задачи, думаю, ясна.
Если такого запроса нет, то есть ли альтернативное решение проблемы когда необходимо чтобы один php файл мог производить выборку данных из определенной таблицы БД автоматически по определенному критерию, т.е. стало известно значение поля таблицы - происходит ее выборка.
Заранее благодарю за помощь.
Дмитрий
Неактивен
Синтаксис SQL требует явно указывать имена таблиц в запросе. Если у вас Mysql 5ой версии и выше, то вы можете использовать information_schema для получения имен таблиц, содержащих fieldname и подготовленные выражения для формирования запроса.
См:
http://sqlinfo.ru/forum/viewtopic.php?id=363
http://sqlinfo.ru/forum/viewtopic.php?id=356
Неактивен
Спасибо за ответ.
К сожалению у меня версия ниже 5-ой.
А нельзя ли решить этот вопрос при помощи оператора UNION?
Неактивен
Если количество таблиц не известно изначально (а именно так я понял исходное условие), то UNION вам ничем не поможет.
Неактивен
Понятно.
В таком случае нужно искать другие способы решения проблемы. В связи с этим возникают дополнительные вопросы для меня, так как у меня было мало практики с использованием MySQL.
1)
На самом деле если всю информацию закладывать в одну общую таблицу, то все вышеописанные проблемы (а также которые возникнут в будущем) отпадают сами собой, но тут встаёт вопрос с оптимизацией памяти.
Например, есть несколько категорий информации. Пусть первые 10 полей таблицы являются общими (т.е. одинаковыми) для всех категорий. Но также для каждой категории индивидуально создаются отдельные поля и количество создаваемых полей зависит от конкретной категории.
В итоге получаем одну таблицу, где общее количество полей, например, равно 15. Первые 10 полей будут всегда заполнены для всех категорий, а вот остальные 5 будут заполняться в зависимости от категории. Таким образом я получу таблицу, которая будет иметь пустые поля.
Будет ли такая таблица кушать много лишней памяти? И вообще как нужно организовывать БД когда есть несколько категорий информации - создавать по одной таблицы для каждой категории или создавать общую таблицу для всех категорий? Ведь при добавлении на сайт блока поиска, вывода обновлений и т.д. легче использовать одну таблицу.
2)
Еще, как вариант, можно создать одну общую таблицу для повторяющихся основных полей у всех категорий и по отдельной таблице с дополнительными полями для каждой категории. в этом случае проблемы с памятью отпадают, т.к. каждая таблица будет запонена только необходимыми данными.
Но тогда какие здесь еще могут быть способы связки общей таблицы с дополнительными, ведь, на мой взгляд, способ fieldname (общей таблицы) = fieldname (дополнительных таблиц) не удобен, т.к. при добавлении инфы в общую таблицу, нужно тут же добавлять инфу в дополнительные, чтобы сохранить синхронизацию и связь.
Как вы справляетесь с такой задачей?
Неактивен
Вобщем в итоге решил я создать 2 таблицы. Одну с общими полями для все категорий, а во вторую определю все дополнительные поля для каждой категории.
Связывать эти таблицы буду при помощи транзакций, т.е. когда в общую таблицу попадает запись, то значение поля id этой записи переносится в определенное поле дополнительной таблицы - таким образом связь между записью определенной категории в главной таблице и в дополнительной никогда не нарушится.
Таким образом я обошел вопрос, когда было необходимо делать выборку из разных, заранее неизвестных таблиц по критерию при помощи information_schema.
Неактивен
Все-таки я кажется нашел способ выборки заранее неизвестной таблицы из числа других.
Итак, допустим имеем два php файла. В первом прописаны ссылки на второй php файл, но в этих ссылках также методом _GET передается какая-нибудь переменная с символьным значением. Каждое значение соответсвует названию таблицы в БД.
Например, ссылка_1(file2.php?cat=table1), ссылка_2(file2.php?cat=table2) и т.д.
Когда file2.php получает эту переменную $cat, просто делаем запрос к БД:
SELECT * FROM $cat
Этот запрос к БД работает нормально, я проверял.
Таким образом можно автоматически выбрать заранее неизвестную таблицу из БД.
Остается надеется, что здесь нет никаких подводных камней.
Неактивен