![]() |
|
Модераторы: skyboy |
![]()
|
|
| DimonSt |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 12.3.2006 Репутация: нет Всего: нет |
Здравствуйте, подскажите как можно извлечить из базы один столбец (получить значения всех строчек) или другой при отсуствии первого, зная имена столбцов...
т.е. мы знаем что в базе данных существует либо поле 'name' либо 'title' надо получить значения существующего... Есть пару вариантов, но увы не один из них не является полностью корректным, на мой взгляд: 1. Извлечь все поля далее смотреть какие столбцы существуют (много лишнего извлекается, а это не быстро) 2. извлечь перечень столбцов и там проверить какие есть каких нет, далее составить корректный запрос, но работа ведется с большим кол-во таблиц и доп. запросов это прибавит достаточно. 3. Какой-то функцией проверить при SELECT существование одного столбца, увы сколько не пытался такую функцию не нашел... Есть еще один вопрос: а как можно с групировать в один запрос: запрос на выяснения колличества строчек в таблице запрос на получения перечьня столбцов Зарание спасибо. |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 6 Всего: 39 |
Столбцы вещь такая они или есть или нет. Чаще всего их как раз добавили, так они и остаются.
Может имеется в виду то, что в строке может быть заполнено илбо 'name' либо 'title'? Тогда делаем так:
Если имеется в виду выбрать все данные из разных таблиц, то тут придётся делать селект для каждой. Можно объеденить потом результат при помощи union. Вообщем вопрос поставлен некоректно. А как извесно правильно поставленый вопрос - 90% ответа. |
|||
|
||||
| DimonSt |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 12.3.2006 Репутация: нет Всего: нет |
Где-то я это слышал, бывают исключения, и код (работаю от PHP) не всегда знает о наличии или отсутствие того или иного столбца... Существуют несколько способов проверки существования. 2 наиболее очевидных я привел.. Прошу указать на ваш взгляд наиболее быстро работающий либо предложить свой способ... |
|||
|
||||
| Secandr |
|
||||||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 6 Всего: 39 |
DimonSt, Если база составлена грамотно, то таблицы и столбцы динамически не меняются!!!!!
Если в процессе работы скрипт постояно создаёт новые таблицы/столбцы/бд гнать программиста в шею! Структура базы создаётся один раз и навсегда. Соответствено наличие столбцов в конкретной таблице гарантировано. Следует вообще не давать пользователю из под которого работает скрипт php с mysql права на ALERT TABLE, только SELECT, INSERT, UPDATE и DELETE. В принципе, если есть необходимость проверки на наличие столбца в таблице, то есть команда DESCRIBE. Хотя задача мне до сих пор не понятна... Ещё раз говорю если под
имелось в виду: дана таблица tb1 в которой два столбца `a` и `b`. необходимо выбрать `a` если не пустое, иначе `b`. Тогда запрос делается просто, я его приводил:
Т.е. Для каждой строки выбрать `a` если оно отлично от null, иначе `b` Можно составить более сложный хапрос в случае если у нас столбцы строки NOT NULL:
Соответствено могут быть вариации по поводу условия... |
||||||
|
|||||||
| DimonSt |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 12.3.2006 Репутация: нет Всего: нет |
О, да, верю..
Нет, пожалуй, себя гнать в шею я не буду, это слишком жестоко...
Нет, не всегда.
спасибо, я уже понял можете больше не преводить, имелось ввиду НЕ это... Так привести пример, кстати примеров можно привести далеко не один: 1. Может не очень качественный пример, но если условится что эти таблицы нельзя переименовать, то: у нас существует 20 таблиц, у каждой существует либо поле name либо title, надо устроить поиск по всем таблицам. 2. Есть пару языков на сайте, при том модули на сайте переведены не на все языки, на каждый модуль по одной таблицы, с полями типа: textRus textEng textFr и т.п. Нам надо построить модули зная какой язык нам хочется видеть. Че то в голову больше ничего не лезет, но можно еще придумать, Насчет DESCRIBE, как я и говорил можно...("извлечь перечень столбцов и там проверить какие есть каких нет, далее составить корректный запрос"), но быстрее ли это чем просто извлечь всю таблицу со всеми значениями, и далее использовать что нужно, а может все же можно во время select отсеить не существующие столбцы, может есть блокатор ошибок в синтаксисе sql, может можно как-то игнорировать столбцы, если их нет? |
||||||||
|
|||||||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 6 Всего: 39 |
Только при обновлении продукта. Давай определимся. Есть по крайней мере де аксиомы: 1. Программист жёстко задаёт структуру базы и знает какой столбец в какой таблице за что отвечает 2. Программист знает что ему нужно. Если придерживаться этих аксиом, то твой пример разрешается в несколько приёмов примерно так:
ты про это говорил? |
|||
|
||||
| DimonSt |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 12.3.2006 Репутация: нет Всего: нет |
если бы так, то я бы не задавал этот вопрос... Да согласен, если задав один раз все столбцы, мы получаем жесткую структуру и вроде бы все хорошо и ПРАВИЛЬНО, но имея возможность изменять/добавлять (в определенных рамках конечно) столбцы мы получаем более гибкую систему с большим количеством возможностей, да возможно это неправильно, так быть не должно и я горе сплошное программист, но я этого не спрашивал, я спрашивал метод наиболее скоростной реализации того, что я захотел, не более и не менее. Итак возьмем за аксиому: мы не знаем сколько столбцов, мы не знаем какие они и что в них, но мы знаем что нужный нам столбец(его имя) начинается с 'STLB' и далее идет одно из перечисленных '1', '2', '32', 'asdf', 'q34', '45hgc', '123dse4', '6ufxz2' и т.п. (то есть: 'STLB1','STLB2','STLBq34',...), при том приоритет извлечения (то есть какой извлекать если их несколько существует) неважен. Итак, внимание вопрос: Какой бы вы код написали чтоб получить любое(ые) значения мигрирующего столбца, если известно что вопрос скорости стоит наиболее резко? |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 6 Всего: 39 |
DimonSt, можешь мне ответить на вопрос: "Как грамотно забивать LSD монитором гвозди, не повредив матрицу?"
Ну не создан mySQL для таких выкрутасов. Я на 95% уверен, что можно сделать ещё более гибкую систему из адекватных таблиц не разрастающихся в ширь. Нужно просто пересмотреть концепцию использования БД. |
|||
|
||||
| DimonSt |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 12.3.2006 Репутация: нет Всего: нет |
Я над этим вопросом почти специализируюсь))... Уж поверте, вы далеко не первый кто его мне задал), видимо и не последний... Ну что ж спасибо за объянение, я пошел заниматься моим вторым излюбленным делом - изобретать велосипед... |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 6 Всего: 39 |
DimonSt, всё ж я бы вопрос поставил не "Как получить любое(ые) значения мигрирующего столбца?", а "Как избавиться от мегрирующего столбца?".
Последний вопрос позволит добиться большей скорости получения данных! А если база создаётся динамически есть смысл посмотреть другие БД, или создать надстройку над mysql. |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 6 Всего: 39 |
вот тебе пример решения твоей проблемы через надстройку:
http://forum.vingrad.ru/index.php?showtopic=87403 |
|||
|
||||
| SergeBS |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 2 Всего: 22 |
DimonSt,
Есть сильное подозрение, что тебе нужно не плодить столбцы/таблицы, а всего лишь выстроить дерево в базе. Т.е. связи в виде предок-потомки. Тогда и структура будет стабильной, и у предка сколько нужно потомков можно наплодить для хранения данных. Возможно, что для этой задачи лучше подойдет Cache как сервер. Или Tamino. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |