За последние 24 часа нас посетили 18005 программистов и 1584 робота. Сейчас ищут 1274 программиста ...

Запрос имени поля

Тема в разделе "PHP и базы данных", создана пользователем Anguis, 29 сен 2011.

  1. Anguis

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

    С нами с:
    17 сен 2011
    Сообщения:
    16
    Симпатии:
    0
    Здравствуйте!
    Вот такой вопрос.
    Есть ли в mysql возможность запросить имя поля по совпадению?
    Т.е. что-то типа: SELECT fieldname FROM tablename WHERE field0 LIKE 'something' OR filed1 LIKE 'something' ?
     
  2. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    PHP:
    1. <?php
    2. // ...
    3. $sql = "SELECT * FROM `tablename`";
    4. $res = mysql_query($sql, $db);
    5. echo('<pre>');
    6. while($field = mysql_fetch_field($res))
    7.     print_r($field);
    8. echo('</pre>');
    9. // ...
    10. ?>
     
  3. Anguis

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

    С нами с:
    17 сен 2011
    Сообщения:
    16
    Симпатии:
    0
    Спасибо. Но это не то, что нужно.
    А нужно вот что:
    В этом запросе SELECT fieldname FROM tablename WHERE field0 LIKE 'something' OR filed1 LIKE 'something'
    Если выполняется первое условие, то возвращается field0, а если второе, то field1
    Запрос конечно не верный. Это я просто для понимания. Вообще можно как-нибудь такое сделать?
     
  4. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Anguis
    Нет, только вытащить результаты в php, и там проверять, какое именно совпало.

    Почему так случилось - могу поспорить, что ошибся при проектировании базы данных. Подобных задач в принципе не должно быть.

    Если много не успел написать - опиши задачу полностью (что нужно хранить и что извлекать), подскажем как лучше спроектировать БД.
     
  5. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Может натолкнуть на мысль:

    http://www.craigsmullins.com/ssu_0899.htm
    [sql]SELECT title, price,
    Budget = CASE price
    WHEN price > 20.00 THEN 'Expensive'
    WHEN price BETWEEN 10.00 AND 19.99 THEN 'Moderate'
    WHEN price < 10.00 THEN 'Inexpensive'
    ELSE 'Unknown'
    END,
    FROM titles[/sql]
     
  6. Anguis

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

    С нами с:
    17 сен 2011
    Сообщения:
    16
    Симпатии:
    0
    Нет. База спроектирована правильно.
    И задача реальная не совсем такая, как я описал в первом посте. Мне при решении этой задачи просто стало интересно, а возможно ли такое на mysql
    Реальная задача в следующем.
    В базе есть записи названий континентов, стран и категорий на двух языках. т.е. поля - continent, continent_en, contry, contry_en, subject, subject_en
    Функция получает строку. Заранее неизвестно, к какому из полей это строка относится. Но известно, что к какому-то из английских полей. Необходимо найти соответствие и вернуть название на русском.
    Решил я её так:
    [sql]
    SELECT `contry` as 'name' FROM `Table` WHERE `contry_en` LIKE '$str' LIMIT 1
    UNION
    SELECT `continent` as 'name' FROM `Table` WHERE `continent_en` LIKE '$str' LIMIT 1
    UNION
    SELECT `subject` as 'name' FROM `Table` WHERE `subject_en` LIKE '$str' LIMIT 1
    [/sql]
    Затем, естественно return $dbresult->name;
    Не самое красивое решение. Может есть иное?
     
  7. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Офигенная база, че.
    Особенно если появится третий язык))
     
  8. Anguis

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

    С нами с:
    17 сен 2011
    Сообщения:
    16
    Симпатии:
    0
    tommyangelo, мне не понятно ваше глумление.
    Третий язык не появится.
     
  9. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    Anguis
    вроде выглядит всё верно, но на самом деле это проблема неправильной структуры базы данных.
    как говорится "неправильные решения порождают неправильные вопросы"

    насчёт проектирования базы - создаётся отдельная таблица, предназначенная именно для поиска, состоящая из след. полей:

    - айди записи
    - название на русском
    - название на английском
    - тип (если нужен)

    обычно также вместо создания отдельной таблицы в базе используют готовые поисковые движки.

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




    upd.

    существует также и другой подход:
    - айди исходной записи
    - название (одно и то же поле используется для всех языков)
    - язык (необязательное - если нужен поиск по какому-то конкретному языку)
    - тип (если используются разные таблицы)

    и делается поиск по русскому, английскому и других языках (если имеются) в одной и той же таблице одним запросом.
    если используются разные таблицы, то понадобится и второй запрос - на данные о записи из исходной таблице на базе найденного айди.
    в данном случае этот способ не подойдёт - лучше использовать первый. а этот - так, на заметку
     
  10. Anguis

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

    С нами с:
    17 сен 2011
    Сообщения:
    16
    Симпатии:
    0
    Нет, господа. В данном случае база верная.
    В базе находятся записи с данными для страниц сайта. Они выбираются по нескольким критериям.
    Первый и основной, естественно id
    Затем Континент
    Затем Категория
    Затем Страна

    На каждое из этих полей существует индекс.

    Одной и той-же записи может быть присвоено несколько (заранее неизвестно сколько) континентов, стран, категорий. И в зависимости от языка, выбранного пользователем, идет поиск по русскому либо английскому полям.

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

    А вообще нужно обсуждать суть проблемы, а не то как я спроектировал базу. В данном случае мой первый пост к моей базе не относится, однако есть другой вопрос:
     
  11. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    звучит как мнение человека, не знакомого с понятием нормализации данных.
    хотя не зная подробностей, не возьмусь судить оправдана ли здесь денормализация - это действительно не то, что спрашивает тс.

    так мы и пытаемся выяснить суть проблемы - откуда взялся подобный "неправильный" вопрос (опять же - неправильные решения порождают неправильные вопросы; лучше исправить корень проблемы, а не симптомы), т.к. в правильно спроектированной базе подобные запросы с юнионом возникать не должны, имхо.

    в данном случае вероятнее всего ответ будет нет - иного решения нет, если не переделывать структуру.

    а вообще, если работает - оставь, пусть работает.