| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > MySQL > Опознавание существующего столбца |
| Автор: DimonSt 12.3.2006, 12:37 |
| Здравствуйте, подскажите как можно извлечить из базы один столбец (получить значения всех строчек) или другой при отсуствии первого, зная имена столбцов... т.е. мы знаем что в базе данных существует либо поле 'name' либо 'title' надо получить значения существующего... Есть пару вариантов, но увы не один из них не является полностью корректным, на мой взгляд: 1. Извлечь все поля далее смотреть какие столбцы существуют (много лишнего извлекается, а это не быстро) 2. извлечь перечень столбцов и там проверить какие есть каких нет, далее составить корректный запрос, но работа ведется с большим кол-во таблиц и доп. запросов это прибавит достаточно. 3. Какой-то функцией проверить при SELECT существование одного столбца, увы сколько не пытался такую функцию не нашел... Есть еще один вопрос: а как можно с групировать в один запрос: запрос на выяснения колличества строчек в таблице запрос на получения перечьня столбцов Зарание спасибо. |
| Автор: Secandr 12.3.2006, 12:59 | ||
| Столбцы вещь такая они или есть или нет. Чаще всего их как раз добавили, так они и остаются. Может имеется в виду то, что в строке может быть заполнено илбо 'name' либо 'title'? Тогда делаем так:
Если имеется в виду выбрать все данные из разных таблиц, то тут придётся делать селект для каждой. Можно объеденить потом результат при помощи union. Вообщем вопрос поставлен некоректно. А как извесно правильно поставленый вопрос - 90% ответа. |
| Автор: DimonSt 12.3.2006, 18:45 | ||
Где-то я это слышал, бывают исключения, и код (работаю от PHP) не всегда знает о наличии или отсутствие того или иного столбца... Существуют несколько способов проверки существования. 2 наиболее очевидных я привел.. Прошу указать на ваш взгляд наиболее быстро работающий либо предложить свой способ... |
| Автор: DimonSt 12.3.2006, 20:21 | ||||||||
О, да, верю..
Нет, пожалуй, себя гнать в шею я не буду, это слишком жестоко...
Нет, не всегда.
спасибо, я уже понял можете больше не преводить, имелось ввиду НЕ это... Так привести пример, кстати примеров можно привести далеко не один: 1. Может не очень качественный пример, но если условится что эти таблицы нельзя переименовать, то: у нас существует 20 таблиц, у каждой существует либо поле name либо title, надо устроить поиск по всем таблицам. 2. Есть пару языков на сайте, при том модули на сайте переведены не на все языки, на каждый модуль по одной таблицы, с полями типа: textRus textEng textFr и т.п. Нам надо построить модули зная какой язык нам хочется видеть. Че то в голову больше ничего не лезет, но можно еще придумать, Насчет DESCRIBE, как я и говорил можно...("извлечь перечень столбцов и там проверить какие есть каких нет, далее составить корректный запрос"), но быстрее ли это чем просто извлечь всю таблицу со всеми значениями, и далее использовать что нужно, а может все же можно во время select отсеить не существующие столбцы, может есть блокатор ошибок в синтаксисе sql, может можно как-то игнорировать столбцы, если их нет? |
| Автор: Secandr 12.3.2006, 20:32 | ||||
| Только при обновлении продукта.
Давай определимся. Есть по крайней мере де аксиомы: 1. Программист жёстко задаёт структуру базы и знает какой столбец в какой таблице за что отвечает 2. Программист знает что ему нужно. Если придерживаться этих аксиом, то твой пример разрешается в несколько приёмов примерно так:
ты про это говорил? |
| Автор: DimonSt 13.3.2006, 17:40 | ||
если бы так, то я бы не задавал этот вопрос... Да согласен, если задав один раз все столбцы, мы получаем жесткую структуру и вроде бы все хорошо и ПРАВИЛЬНО, но имея возможность изменять/добавлять (в определенных рамках конечно) столбцы мы получаем более гибкую систему с большим количеством возможностей, да возможно это неправильно, так быть не должно и я горе сплошное программист, но я этого не спрашивал, я спрашивал метод наиболее скоростной реализации того, что я захотел, не более и не менее. Итак возьмем за аксиому: мы не знаем сколько столбцов, мы не знаем какие они и что в них, но мы знаем что нужный нам столбец(его имя) начинается с 'STLB' и далее идет одно из перечисленных '1', '2', '32', 'asdf', 'q34', '45hgc', '123dse4', '6ufxz2' и т.п. (то есть: 'STLB1','STLB2','STLBq34',...), при том приоритет извлечения (то есть какой извлекать если их несколько существует) неважен. Итак, внимание вопрос: Какой бы вы код написали чтоб получить любое(ые) значения мигрирующего столбца, если известно что вопрос скорости стоит наиболее резко? |
| Автор: Secandr 13.3.2006, 20:24 |
| DimonSt, можешь мне ответить на вопрос: "Как грамотно забивать LSD монитором гвозди, не повредив матрицу?" Ну не создан mySQL для таких выкрутасов. Я на 95% уверен, что можно сделать ещё более гибкую систему из адекватных таблиц не разрастающихся в ширь. Нужно просто пересмотреть концепцию использования БД. |
| Автор: DimonSt 13.3.2006, 22:45 | ||
Я над этим вопросом почти специализируюсь))... Уж поверте, вы далеко не первый кто его мне задал), видимо и не последний... Ну что ж спасибо за объянение, я пошел заниматься моим вторым излюбленным делом - изобретать велосипед... |
| Автор: Secandr 13.3.2006, 22:51 |
| DimonSt, всё ж я бы вопрос поставил не "Как получить любое(ые) значения мигрирующего столбца?", а "Как избавиться от мегрирующего столбца?". Последний вопрос позволит добиться большей скорости получения данных! А если база создаётся динамически есть смысл посмотреть другие БД, или создать надстройку над mysql. |
| Автор: Secandr 14.3.2006, 17:44 |
| вот тебе пример решения твоей проблемы через надстройку: http://forum.vingrad.ru/index.php?showtopic=87403 |
| Автор: SergeBS 16.3.2006, 11:28 |
| DimonSt, Есть сильное подозрение, что тебе нужно не плодить столбцы/таблицы, а всего лишь выстроить дерево в базе. Т.е. связи в виде предок-потомки. Тогда и структура будет стабильной, и у предка сколько нужно потомков можно наплодить для хранения данных. Возможно, что для этой задачи лучше подойдет Cache как сервер. Или Tamino. |