За последние 24 часа нас посетили 17586 программистов и 1623 робота. Сейчас ищут 1606 программистов ...

Можно ли использовать в качестве имени таблицы в запросе?

Тема в разделе "MySQL", создана пользователем Xerk, 3 апр 2008.

Статус темы:
Закрыта.
  1. Xerk

    Xerk Активный пользователь

    С нами с:
    5 окт 2007
    Сообщения:
    177
    Симпатии:
    0
    Адрес:
    Владивосток
    грубо говоря есть запрос [sql]select table_prefix from table where условие;[/sql]

    результат этого запроса нужно использовать в другом запросе в качестве имени таблицы. можно ли как-то поместить этот запрос в подзапрос? если да, то как это будет выглядеть?
    что-нить вроде этого? [sql]select поля from CONCAT((select table_prefix from table where условие),'_table') where условие;[/sql]


    ps: Ответ нужен срочно, поэтому на мануалы просто нет времени
    Pps: Просто интересно, поддерживают ли подзапросы многомерную вложенность?
     
  2. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    а проверить самостоятельно?
     
  3. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    А ждать ответа время есть?
    [sql]select поля from (select table_prefix from table where условие) where условие;[/sql]
    Покажи исходные запросы, может там JOIN'ом можно обойтись.
     
  4. Xerk

    Xerk Активный пользователь

    С нами с:
    5 окт 2007
    Сообщения:
    177
    Симпатии:
    0
    Адрес:
    Владивосток
    я вообще хз как оно, может кто решение лучше знает
     
  5. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    попробуй в моей подписи почитать
     
  6. Xerk

    Xerk Активный пользователь

    С нами с:
    5 окт 2007
    Сообщения:
    177
    Симпатии:
    0
    Адрес:
    Владивосток
    Это только префикс к имени таблицы, нужно еще окончание ставить.

    имеется таблица в БД в которой прописаны уникальное имя и префикс к связанными с ним таблицами.
    Во входных данных класса имеется это уникальное имя, и на основе его класс должен получить префикс имен таблиц, добавить окончание имен и сделать выборку строк.

    Может есть переменные в mysql которым можно было бы присвоить результат выполнения оператора, и использовать в следующем?


    дык я пока ответа жду - другое делаю.
     
  7. Xerk

    Xerk Активный пользователь

    С нами с:
    5 окт 2007
    Сообщения:
    177
    Симпатии:
    0
    Адрес:
    Владивосток
    у меня справочник по MySql под боком. Времени нет читать.
    Сейчас 11 вечера, завтра с утра уже надо чтоб все закончено было... поэтому просил работающий запрос.
    Ладно... тему на помойку, сам найду решение...
     
  8. Xerk

    Xerk Активный пользователь

    С нами с:
    5 окт 2007
    Сообщения:
    177
    Симпатии:
    0
    Адрес:
    Владивосток
    Короче вот такой бред получился в итоге:
    [sql]set @test = (concat('select field1, field2 from ', (select prefix from table_names where field1='param'), '_part_table_name'));
    prepare x from @test;
    execute x;[/sql]

    Я знаю, есть лучше решение, но вы его скрываете))
     
  9. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    ага, и называется оно: Грамотное проектирование реляционных баз данных
     
  10. Xerk

    Xerk Активный пользователь

    С нами с:
    5 окт 2007
    Сообщения:
    177
    Симпатии:
    0
    Адрес:
    Владивосток
    Топас, офигенные ответы, ниочем. вообще ниочем. Я даже несколько засомневался, а настолько ли ты знающий человек, как пытаешься показать?
     
  11. nimistar

    nimistar Активный пользователь

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    а нормальны ответ один - НЕТ!

    а он пытался подсказать как можно иначе это сделать ...
    вопрос не очем - ну и ответ в стиле вопроса!

    (с высоты прожитых лет - далать надо теми средствами и методами , которые знаешь - а те что незнаешь изучать - но непытатся ими за час написать программу - точно выйдет фигня)
     
  12. Anonymous

    Anonymous Guest

    *щаааа... щаа все огребут демократии... полной ложкой*
     
  13. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Xerk
    На провокацию не поддаюсь :)

    А если развернуть ответ, то вот что хотел бы сказать:
    Если мы хотим видеть наследование на уровне БД, то конечно, логично предположить, что есть одна таблица содержащит базовые поля. Таблицы-наследницы - расширение.
    Но!
    Почему я скептически отношусь к Вашей задаче:
    Если мы даже имеем такую структуру, то глупо, я подчеркиваю, просто очень глупо пытаться получить все "объекты" в одном запросе! У разных таблиц разные поля! Если и хотим получить общие поля, то достаточно обратиться к родительской таблице. А если вдруг поля у дочерних таблиц совпадают то бессмысленно было делать такое разделение.

    Теперь дошло?
     
  14. nimistar

    nimistar Активный пользователь

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    topas +1 - но ответ то всеравно нет :)
     
  15. Xerk

    Xerk Активный пользователь

    С нами с:
    5 окт 2007
    Сообщения:
    177
    Симпатии:
    0
    Адрес:
    Владивосток
    топас, прочти внимательно плиз, что мне надо было-то

    Мне нужно из таблицы БД получить название другой таблицы и уже из другой таблицы выбрать значение.
    Может быть так, что из одной таблицы получаешь имя другой таблицы, из другой таблицы получаешь имя третей. И уже с третьей получаешь значение.
    Заранее известно только имя первой таблицы...

    как сделать это, чтоб эту цепочку можно было пройти одним запросом, не делая 2-3 запроса?

    добавлено:
    тот вариант что выше - работает, но он мне не нравится, корявый слишком(
     
  16. Xerk

    Xerk Активный пользователь

    С нами с:
    5 окт 2007
    Сообщения:
    177
    Симпатии:
    0
    Адрес:
    Владивосток
    То, о чем вы говорите - это объединением таблиц можно было бы добиться и АБСОЛЮТНО не то, о чем говорю я.
     
  17. Xerk

    Xerk Активный пользователь

    С нами с:
    5 окт 2007
    Сообщения:
    177
    Симпатии:
    0
    Адрес:
    Владивосток
    Я использую то что есть, придумывать другую структуру тупо времени нет, может потом. если начальство скажет.
     
  18. Xerk

    Xerk Активный пользователь

    С нами с:
    5 окт 2007
    Сообщения:
    177
    Симпатии:
    0
    Адрес:
    Владивосток
    Наткнулся на способ нормальной организации БД под мою задачу...

    Но вопрос о том, как еще можно было бы решить ту задачу, которую я описал изначально ( как использовать значение, возвращаемое селектом, в качестве имени/части имени другой таблицы, из которой уже и происходит выборка возвращаемой в скрипт информации) считаю открытым... Хотяб даже для саморазвития.
     
  19. Xerk

    Xerk Активный пользователь

    С нами с:
    5 окт 2007
    Сообщения:
    177
    Симпатии:
    0
    Адрес:
    Владивосток
    знатоки блин :) ответ ДА, есть способ пусть и корявенький, зато работает) не важно НАХРЕНА, важно что РАБОТАЕТ)

    ЗЫ: Кстати, запомните: чтоб знать чем плох какой-либо способ реализации, надо еще знать как этот способ реализовать)
     
  20. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Это задача для рекурсии. Как ты представляешь себе рекурсию одним запросом?
     
  21. nimistar

    nimistar Активный пользователь

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    я отвечал на первый вопрос ..

    то что ты задал вопрос иначе я незаметил! сорри!
     
  22. Xerk

    Xerk Активный пользователь

    С нами с:
    5 окт 2007
    Сообщения:
    177
    Симпатии:
    0
    Адрес:
    Владивосток
    RomanBush тут у меня просто, у меня был "адрес", вида /id1/id2
    Обращаясь к таблице имя которой мне известно , получаю имя следующей таблицы ("id1"), в этой таблице хранится информация о имени таблицы "id2", с вот этой таблицы, уже и происходит выборка.

    в пхп формируется извращенный запрос
    [sql]
    set @table_name = (concat ((select prefix from root_table where table_id="id1"), '_childs'));
    set @query = (concat ('select prefix from ', @table_name, 'where table_id="id2"'), '_content'));
    prepare x from @query;
    set @table_name = (execute x);
    set @query = (concat('select field1, field2 from ', @table_name, ' where param="value"'));
    prepare x from @query;
    execute x;
    [/sql]
     
  23. Xerk

    Xerk Активный пользователь

    С нами с:
    5 окт 2007
    Сообщения:
    177
    Симпатии:
    0
    Адрес:
    Владивосток
    смысл этого в том, чтоб заставить строчку в переменной выполниться, получается в некотором роде аналог eval($query) в пхп
    [sql]prepare x from @query;
    execute x;[/sql]


    MySQL к сожалению не понимает записи вида select field1, field2 from @table_name where param="value"
     
  24. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Re: Можно ли использовать в качестве имени таблицы в запросе

    Написал в 14:50, потом тратил время на спор, а в 19:50 всё ещё был в ожидании ответа. На мануал ведь совсем-совсем времени нет, ио нужно срочно.

    В жалобах обсуждались необучаемые люди, люди не желающие читать мануал, люди грубые и ваще не хорошие. Вот товарисч явный пример.

    А как бы закончилось, если бы Xerk человек был хороший, душевный, я бы сказал: спросил бы у topas разьяснить и сейчас была бы переделаная таблица с нормальными отношениями разных видов и одним простым запросом в итоге.
     
  25. Xerk

    Xerk Активный пользователь

    С нами с:
    5 окт 2007
    Сообщения:
    177
    Симпатии:
    0
    Адрес:
    Владивосток
    lexa опять же ВНИМАТЕЛЬНО читай, я нашел решение.
    Со структурой БД, готовыми шаблонами запросов под мои нужды, и использовал его, необходимость в срочном ответе по первоначальному вопросу отпала. Освободившееся время я и тратил на спор, который мне интересен.

    ЗЫ: Что-то люди тут стали совсем невнимательные( весна, авитаминоз однако... Мозг надо подкормить)
     
Статус темы:
Закрыта.