Здравствуйте! Вот такой вопрос. Есть ли в mysql возможность запросить имя поля по совпадению? Т.е. что-то типа: SELECT fieldname FROM tablename WHERE field0 LIKE 'something' OR filed1 LIKE 'something' ?
PHP: <?php // ... $sql = "SELECT * FROM `tablename`"; $res = mysql_query($sql, $db); echo('<pre>'); while($field = mysql_fetch_field($res)) print_r($field); echo('</pre>'); // ... ?>
Для mysqli_*: http://ru.php.net/manual/en/mysqli-resu ... direct.php http://ru.php.net/manual/en/mysqli-resu ... -field.php http://ru.php.net/manual/en/mysqli-resu ... fields.php http://ru.php.net/manual/en/mysqli-resu ... -count.php http://ru.php.net/manual/en/mysqli-resu ... d-seek.php
Спасибо. Но это не то, что нужно. А нужно вот что: В этом запросе SELECT fieldname FROM tablename WHERE field0 LIKE 'something' OR filed1 LIKE 'something' Если выполняется первое условие, то возвращается field0, а если второе, то field1 Запрос конечно не верный. Это я просто для понимания. Вообще можно как-нибудь такое сделать?
Anguis Нет, только вытащить результаты в php, и там проверять, какое именно совпало. Почему так случилось - могу поспорить, что ошибся при проектировании базы данных. Подобных задач в принципе не должно быть. Если много не успел написать - опиши задачу полностью (что нужно хранить и что извлекать), подскажем как лучше спроектировать БД.
Может натолкнуть на мысль: 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]
Нет. База спроектирована правильно. И задача реальная не совсем такая, как я описал в первом посте. Мне при решении этой задачи просто стало интересно, а возможно ли такое на 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; Не самое красивое решение. Может есть иное?
Anguis вроде выглядит всё верно, но на самом деле это проблема неправильной структуры базы данных. как говорится "неправильные решения порождают неправильные вопросы" насчёт проектирования базы - создаётся отдельная таблица, предназначенная именно для поиска, состоящая из след. полей: - айди записи - название на русском - название на английском - тип (если нужен) обычно также вместо создания отдельной таблицы в базе используют готовые поисковые движки. но суть будет примерна та же, просто реализованная в отдельном приложении. upd. существует также и другой подход: - айди исходной записи - название (одно и то же поле используется для всех языков) - язык (необязательное - если нужен поиск по какому-то конкретному языку) - тип (если используются разные таблицы) и делается поиск по русскому, английскому и других языках (если имеются) в одной и той же таблице одним запросом. если используются разные таблицы, то понадобится и второй запрос - на данные о записи из исходной таблице на базе найденного айди. в данном случае этот способ не подойдёт - лучше использовать первый. а этот - так, на заметку
Нет, господа. В данном случае база верная. В базе находятся записи с данными для страниц сайта. Они выбираются по нескольким критериям. Первый и основной, естественно id Затем Континент Затем Категория Затем Страна На каждое из этих полей существует индекс. Одной и той-же записи может быть присвоено несколько (заранее неизвестно сколько) континентов, стран, категорий. И в зависимости от языка, выбранного пользователем, идет поиск по русскому либо английскому полям. Не вижу абсолютно ни какого смысла создавать отдельные таблицы для списков стран, категорий и континентов. А потом опять-же айдишники записывать в какие-то поля для записей с данными страниц, тем паче что с интеджерами здесь не поработать - может быть присвоено несколько стран, а значит и несколько айдишников надо писать в поле, а это только строкой. А вообще нужно обсуждать суть проблемы, а не то как я спроектировал базу. В данном случае мой первый пост к моей базе не относится, однако есть другой вопрос:
звучит как мнение человека, не знакомого с понятием нормализации данных. хотя не зная подробностей, не возьмусь судить оправдана ли здесь денормализация - это действительно не то, что спрашивает тс. так мы и пытаемся выяснить суть проблемы - откуда взялся подобный "неправильный" вопрос (опять же - неправильные решения порождают неправильные вопросы; лучше исправить корень проблемы, а не симптомы), т.к. в правильно спроектированной базе подобные запросы с юнионом возникать не должны, имхо. в данном случае вероятнее всего ответ будет нет - иного решения нет, если не переделывать структуру. а вообще, если работает - оставь, пусть работает.