Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Опознавание существующего столбца 
:(
    Опции темы
DimonSt
Дата 12.3.2006, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.3.2006

Репутация: нет
Всего: нет



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

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

Зарание спасибо.
PM MAIL   Вверх
Secandr
Дата 12.3.2006, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 6
Всего: 39



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

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

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

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


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

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


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
DimonSt
Дата 12.3.2006, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.3.2006

Репутация: нет
Всего: нет



Цитата

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


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

PM MAIL   Вверх
Secandr
Дата 12.3.2006, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 6
Всего: 39



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`

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


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
DimonSt
Дата 12.3.2006, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.3.2006

Репутация: нет
Всего: нет



Цитата

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

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

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

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

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

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

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

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

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

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

Насчет DESCRIBE, как я и говорил можно...("извлечь перечень столбцов и там проверить какие есть каких нет, далее составить корректный запрос"), но быстрее ли это чем просто извлечь всю таблицу со всеми значениями, и далее использовать что нужно, а может все же можно во время select отсеить не существующие столбцы, может есть блокатор ошибок в синтаксисе sql, может можно как-то игнорировать столбцы, если их нет?
PM MAIL   Вверх
Secandr
Дата 12.3.2006, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 6
Всего: 39



Цитата(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 "%ас%"


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


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
DimonSt
Дата 13.3.2006, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.3.2006

Репутация: нет
Всего: нет



Цитата

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

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

Итак возьмем за аксиому: мы не знаем сколько столбцов, мы не знаем какие они и что в них, но мы знаем что нужный нам столбец(его имя) начинается с 'STLB' и далее идет одно из перечисленных '1', '2', '32', 'asdf', 'q34', '45hgc', '123dse4', '6ufxz2' и т.п. (то есть: 'STLB1','STLB2','STLBq34',...), при том приоритет извлечения (то есть какой извлекать если их несколько существует) неважен.
Итак, внимание вопрос:
Какой бы вы код написали чтоб получить любое(ые) значения мигрирующего столбца, если известно что вопрос скорости стоит наиболее резко?
PM MAIL   Вверх
Secandr
Дата 13.3.2006, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 6
Всего: 39



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

Ну не создан mySQL для таких выкрутасов. Я на 95% уверен, что можно сделать ещё более гибкую систему из адекватных таблиц не разрастающихся в ширь. Нужно просто пересмотреть концепцию использования БД.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
DimonSt
Дата 13.3.2006, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.3.2006

Репутация: нет
Всего: нет



Цитата

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


Я над этим вопросом почти специализируюсь))... Уж поверте, вы далеко не первый кто его мне задал), видимо и не последний... Ну что ж спасибо за объянение, я пошел заниматься моим вторым излюбленным делом - изобретать велосипед...
PM MAIL   Вверх
Secandr
Дата 13.3.2006, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 6
Всего: 39



DimonSt, всё ж я бы вопрос поставил не "Как получить любое(ые) значения мигрирующего столбца?", а "Как избавиться от мегрирующего столбца?".

Последний вопрос позволит добиться большей скорости получения данных!

А если база создаётся динамически есть смысл посмотреть другие БД, или создать надстройку над mysql.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Secandr
Дата 14.3.2006, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 6
Всего: 39



вот тебе пример решения твоей проблемы через надстройку:
http://forum.vingrad.ru/index.php?showtopic=87403


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
SergeBS
Дата 16.3.2006, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 2
Всего: 22



DimonSt,
Есть сильное подозрение, что тебе нужно не плодить столбцы/таблицы, а всего лишь выстроить дерево в базе. Т.е. связи в виде предок-потомки. Тогда и структура будет стабильной, и у предка сколько нужно потомков можно наплодить для хранения данных. Возможно, что для этой задачи лучше подойдет Cache как сервер. Или Tamino.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0547 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.