Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Опознавание существующего столбца


Автор: DimonSt 12.3.2006, 12:37
Здравствуйте, подскажите как можно извлечить из базы один столбец (получить значения всех строчек) или другой при отсуствии первого, зная имена столбцов...
т.е. мы знаем что в базе данных существует либо поле 'name' либо 'title' надо получить значения существующего...
Есть пару вариантов, но увы не один из них не является полностью корректным, на мой взгляд:
1. Извлечь все поля далее смотреть какие столбцы существуют (много лишнего извлекается, а это не быстро)
2. извлечь перечень столбцов и там проверить какие есть каких нет, далее составить корректный запрос, но работа ведется с большим кол-во таблиц и доп. запросов это прибавит достаточно.
3. Какой-то функцией проверить при SELECT существование одного столбца, увы сколько не пытался такую функцию не нашел...

Есть еще один вопрос: а как можно с групировать в один запрос:
запрос на выяснения колличества строчек в таблице
запрос на получения перечьня столбцов

Зарание спасибо.

Автор: Secandr 12.3.2006, 12:59
Столбцы вещь такая они или есть или нет. Чаще всего их как раз добавили, так они и остаются.

Может имеется в виду то, что в строке может быть заполнено илбо 'name' либо 'title'?

Тогда делаем так:
Код

SELECT IFNULL(`name`,`title`)  FROM `table1`


Если имеется в виду выбрать все данные из разных таблиц, то тут придётся делать селект для каждой. Можно объеденить потом результат при помощи union.

Вообщем вопрос поставлен некоректно. А как извесно правильно поставленый вопрос - 90% ответа.

Автор: DimonSt 12.3.2006, 18:45
Цитата

Столбцы вещь такая они или есть или нет. Чаще всего их как раз добавили, так они и остаются.


Где-то я это слышал, бывают исключения, и код (работаю от PHP) не всегда знает о наличии или отсутствие того или иного столбца... Существуют несколько способов проверки существования. 2 наиболее очевидных я привел.. Прошу указать на ваш взгляд наиболее быстро работающий либо предложить свой способ...

Автор: Secandr 12.3.2006, 19:17
DimonSt, Если база составлена грамотно, то таблицы и столбцы динамически не меняются!!!!!
Если в процессе работы скрипт постояно создаёт новые таблицы/столбцы/бд гнать программиста в шею!

Структура базы создаётся один раз и навсегда. Соответствено наличие столбцов в конкретной таблице гарантировано.

Следует вообще не давать пользователю из под которого работает скрипт php с mysql права на ALERT TABLE, только SELECT, INSERT, UPDATE и DELETE.

В принципе, если есть необходимость проверки на наличие столбца в таблице, то есть команда DESCRIBE.

Хотя задача мне до сих пор не понятна...

Ещё раз говорю если под
Цитата(DimonSt @ 12.3.2006, 13:37 Найти цитируемый пост)
можно извлечить из базы один столбец (получить значения всех строчек) или другой при отсуствии первого

имелось в виду:
дана таблица tb1 в которой два столбца `a` и `b`.
необходимо выбрать `a` если не пустое, иначе `b`.

Тогда запрос делается просто, я его приводил:
Код

SELECT IFNULL(`a`,`b`)  FROM `tb1`


Т.е. Для каждой строки выбрать `a` если оно отлично от null, иначе `b`

Можно составить более сложный хапрос в случае если у нас столбцы строки NOT NULL:
Код

SELECT IF(`LENGTH`<1,`a`,`b`) FROM `tb1`

Соответствено могут быть вариации по поводу условия...

Автор: DimonSt 12.3.2006, 20:21
Цитата

DimonSt, Если база составлена грамотно, то таблицы и столбцы динамически не меняются!!!!!

О, да, верю..
Цитата

Если в процессе работы скрипт постояно создаёт новые таблицы/столбцы/бд гнать программиста в шею!

Нет, пожалуй, себя гнать в шею я не буду, это слишком жестоко...
Цитата

Структура базы создаётся один раз и навсегда

Нет, не всегда.
Цитата

"все примеры с если не пусто, если отличное от опр. значения"

спасибо, я уже понял можете больше не преводить, имелось ввиду НЕ это...

Так привести пример, кстати примеров можно привести далеко не один:
1. Может не очень качественный пример, но если условится что эти таблицы нельзя переименовать, то: у нас существует 20 таблиц, у каждой существует либо поле name либо title, надо устроить поиск по всем таблицам.
2. Есть пару языков на сайте, при том модули на сайте переведены не на все языки, на каждый модуль по одной таблицы, с полями типа: textRus textEng textFr и т.п. Нам надо построить модули зная какой язык нам хочется видеть.

Че то в голову больше ничего не лезет, но можно еще придумать,

Насчет DESCRIBE, как я и говорил можно...("извлечь перечень столбцов и там проверить какие есть каких нет, далее составить корректный запрос"), но быстрее ли это чем просто извлечь всю таблицу со всеми значениями, и далее использовать что нужно, а может все же можно во время select отсеить не существующие столбцы, может есть блокатор ошибок в синтаксисе sql, может можно как-то игнорировать столбцы, если их нет?

Автор: Secandr 12.3.2006, 20:32
Цитата(DimonSt @ 12.3.2006, 21:21 Найти цитируемый пост)
Нет, не всегда.

Только при обновлении продукта.

Цитата(DimonSt @ 12.3.2006, 21:21 Найти цитируемый пост)
1. Может не очень качественный пример, но если условится что эти таблицы нельзя переименовать, то: у нас существует 20 таблиц, у каждой существует либо поле name либо title, надо устроить поиск по всем таблицам.

Давай определимся. Есть по крайней мере де аксиомы:
1. Программист жёстко задаёт структуру базы и знает какой столбец в какой таблице за что отвечает
2. Программист знает что ему нужно.

Если придерживаться этих аксиом, то твой пример разрешается в несколько приёмов примерно так:

Код

SELECT `name` FROM `tb1` WHERE `name` LIKE "%ас%"
UNION
SELECT `title` FROM `tb2` WHERE `title` LIKE "%ас%"
UNION
SELECT IFNULL(`a`,`b`)  FROM `tb3` WHERE `a` LIKE "%ас%" or `b` LIKE "%ас%"


ты про это говорил?

Автор: DimonSt 13.3.2006, 17:40
Цитата

1. Программист жёстко задаёт структуру базы

если бы так, то я бы не задавал этот вопрос...
Да согласен, если задав один раз все столбцы, мы получаем жесткую структуру и вроде бы все хорошо и ПРАВИЛЬНО, но имея возможность изменять/добавлять (в определенных рамках конечно) столбцы мы получаем более гибкую систему с большим количеством возможностей, да возможно это неправильно, так быть не должно и я горе сплошное программист, но я этого не спрашивал, я спрашивал метод наиболее скоростной реализации того, что я захотел, не более и не менее.

Итак возьмем за аксиому: мы не знаем сколько столбцов, мы не знаем какие они и что в них, но мы знаем что нужный нам столбец(его имя) начинается с '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
Цитата

"Как грамотно забивать LSD монитором гвозди, не повредив матрицу?"


Я над этим вопросом почти специализируюсь))... Уж поверте, вы далеко не первый кто его мне задал), видимо и не последний... Ну что ж спасибо за объянение, я пошел заниматься моим вторым излюбленным делом - изобретать велосипед...

Автор: 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.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)