За последние 24 часа нас посетили 22760 программистов и 1258 роботов. Сейчас ищут 757 программистов ...

массив в строке

Тема в разделе "MySQL", создана пользователем smails, 22 дек 2006.

  1. smails

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

    С нами с:
    24 июл 2006
    Сообщения:
    231
    Симпатии:
    0
    Адрес:
    Москва
    Здрасти!
    Есть бд test в ней таблица table с полями id и var

    Мне нужно сделать в поле var что-то типо массива, например:
    в поле var массив
    $mass[1] = "value1"
    $mass[2] = "value2" и т. д.

    Но хотелось бы осуществить это с помощью функций mysql не применяя метод типо этого:
    в поле var значение: value1***value2 и из этого значения массив с помощью php: explode("***", $mass) - способ не из плохих, но хочется с помощью mysql:)

    Есть такая возможность в mysql?
     
  2. simpson

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

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
  3. smails

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

    С нами с:
    24 июл 2006
    Сообщения:
    231
    Симпатии:
    0
    Адрес:
    Москва
    смотри, знаешь есть метод хранения банных в файлах?
    записываются данные примерно так:
    id***значение
    *** - идёт как различитель между id и значением

    это заменилось базой дынных, там есть поля id в котором id числа и поле var в котором значение...

    так вот в поле var в котором значения, мне нужно поместить массив

    если вводить массивом в php, то получится типо такого:
    $mass['id'] и $mass['var']
    но мне нужно в массиве $mass['var'] создать ещё один массив, типо такого:
    $mass['var']['var2'] но чтобы значения var2 хранились в бд, в поле var в виде массива
     
  4. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    :-D

    Храни в виде строки, используй какой-нибудь разделитель (те же *** или запятую или точку с запятой или еще что-то). Перед вставкой в БД делай implode, а при выборке explode.
    Другой вариант - отдельная таблица, гда каждому значению var сопоставляется несколько var2. Ну и индекс по var.
     
  5. smails

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

    С нами с:
    24 июл 2006
    Сообщения:
    231
    Симпатии:
    0
    Адрес:
    Москва
    так вот именно не хочу создавать таблицу, пока точно не узнаю есть ли способ, которым я хочу воспользовать
     
  6. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    smails
    Думаю, прочтение документации о типах данных, поддерживаемых MySQL, поможет прояснить ситуацию. Я предложил два очевидных способа - выбирай.
     
  7. smails

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

    С нами с:
    24 июл 2006
    Сообщения:
    231
    Симпатии:
    0
    Адрес:
    Москва
    Прочитал тут: http://www.mysql.ru/docs/man/Column_types.html
    Нет такой, о которую хочу...((
    Знаю эти способы как облупленные, но помоему должен быть такой тип, что массивы хранятся... хотя пока не придумал как это может выглядель на языке sql:)
    А хотя возможно я хочу невозможного...
     
  8. Anonymous

    Anonymous Guest

    smails, просто это уже не СУРБД надо, а обьекто-оринтирвную...
     
  9. smails

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

    С нами с:
    24 июл 2006
    Сообщения:
    231
    Симпатии:
    0
    Адрес:
    Москва
    приведи пример хоть одной из них
    Хотя если буду знать, что такая есть, то всё равно хостингу не прикажешь, чтоб такая на хосте была, да и к mysql больше привык...

    Но будет полезно что-то новое узнасть :)
     
  10. Anonymous

    Anonymous Guest

    Старшие Ораклы все умеют, DB2 IBM-ская... много их довольно таки...
     
  11. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    smails
    Лучше задумайся о том, что такое массив и как устроены базы данных (именно базы, не системы управления). А уметь система управления может многое, в том числе принимать на вход массив и хранить его первым или вторым способом,а может и двумя сразу. Или уметь оба, а в зависимости от массива - выбирать.
    В случае MySQL эта функция возложена на программиста.

    Было такое выражение: "Зри в корень." (с) Козьма Прутков (по-моему его это слова).
     
  12. Anonymous

    Anonymous Guest

    ls / ? =)
     
  13. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    unix придумали немного позже :)
     
  14. taran2l

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

    С нами с:
    23 дек 2006
    Сообщения:
    22
    Симпатии:
    0
    Адрес:
    Україна
    Я взагаліто завжди використовую спосіб з explode(), але якщо ти нехочеш тримати всі дані масива в одному полі тоді просто створи ще декілька таблиць, де кожний запис буде елементом масиву, а в поле var занось назви цих таблиць (до якої саме потрібно звертатись).
     
  15. Mavir

    Mavir Guest

    taran2l, не ошиблись ли Вы форумом? Или украинский язык стал международным?
     
  16. taran2l

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

    С нами с:
    23 дек 2006
    Сообщения:
    22
    Симпатии:
    0
    Адрес:
    Україна
    Невже так важлива мова, мені здається мене зрозуміють.
    Тим більше нехочу паклюжити російську - без помилок ненапишу напевно жодного речення.

    Чому в виборі мови інтерфейсу форума є Українська?
     
  17. Mavir

    Mavir Guest

    Тоже мне пуп земли. Вы глубоко ошибаетесь. Даже скажу больше, не захотят общаться.

    Чтобы было если я начал писать на белорусском, Vladson на эстонском, Горбунов Олег на казахском?
     
  18. DarkElf

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

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    >>Чтобы было если я начал писать на белорусском

    был я в Минске.. по началу просто в шок приводили объявления в Минском метро на белорусском, "граждане, остерегайтесь краж из карманов и сумок".. да еще и таким темпом=)
     
  19. taran2l

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

    С нами с:
    23 дек 2006
    Сообщения:
    22
    Симпатии:
    0
    Адрес:
    Україна
    Понял больше не буду.
     
  20. virabhadra

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

    С нами с:
    11 дек 2006
    Сообщения:
    127
    Симпатии:
    0
    Адрес:
    Praha, Czech Republic
    smails, я так понял, что у тебя одно из полей в таблице содержит массив.
    На вопрос о том, в каком виде хранить данные, можно ответить, если знать, что ты хочешь делать с этими данными.
    Например:
    Я делаю базу данных фотографий.
    Существуе набор категорий.
    В таблице с фотографиями, есть поле в котором через разделитель записаны категории, которые относятся к данной фотке. На странице на сайте требуется выводить таблицу с фотками, в соответствии с выбранными категориями, т.е. их может быть несколько выбрано.

    Я рылся в документации, искал разные способы организации такой БД. Пробовал разные варианты.
    В результате нашел, что в запросах MySQL можно делать расширенные запросы с помощью слова REGEXP.
    Поэтому организовал БД так...
    Код (Text):
    1.  
    2. FileName                 Category
    3. muha_na_cvetke.jpg       flower,insect
    4. ptica_v_nebe.jpg         bird,sky
    5. muha_v_nebe.jpg          insect,sky
    6. zakat.jpg                sky
    Теперь, если мне нужна какая-то категория, или несколько, я делаю запрос:
    Код (Text):
    1. SELECT t.Category REGEXP 'insect|bird' FROM table t;
    И мне возвращаются таблица с указанием на записи, которые содержат данные ключевые слова.
    (Подробнее почитать об этом можно здесь http://www.php.ru/mysql/regexp.html)
     
  21. Mavir

    Mavir Guest

    Сильно сомневаюсь. Вернется 0 или 1. Условие t.Category REGEXP 'insect|bird' нужно ставить в WHERE
     
  22. virabhadra

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

    С нами с:
    11 дек 2006
    Сообщения:
    127
    Симпатии:
    0
    Адрес:
    Praha, Czech Republic
    Mavir, я это выражение писал не из головы, а проверил в MySQL Query Browser на существующей таблице. Работает!
    Возвращает таблицу с 0 и 1, как вы правильно заметили, номера ячее с еденичками соответствуют номерам нужных записей в БД.
    Для большей точности запроса, я бы еще добавил:
    Код (Text):
    1. SELECT t.Category REGEXP 'insect|bird' FROM table t ORDER BY t.Filename;
    Тоже только что проверил запрос. Тоже работает.
     
  23. Mavir

    Mavir Guest

    Кроме 0 и 1 больше нет никакой информации. Как можно соотнести какую-то 0(1) с записью в таблице? Во-вторых, в таком случае будут выбраны все записи из таблицы. А зачем выбирать данные которые нам не нужны (т.е. те, для которых вернется 0)?

    P.S. Откройте для себя конструкцию "WHERE". Это намного упростит Вам жизнь.
     
  24. virabhadra

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

    С нами с:
    11 дек 2006
    Сообщения:
    127
    Симпатии:
    0
    Адрес:
    Praha, Czech Republic
    Mavir, как больше никакой информации?
    А порядковый номер ячейки в запросе?
    Он же прямо указывает на номер записи.
    Можно сделать вложенный запрос, который выбирает те записи, для который есть 1.
     
  25. Mavir

    Mavir Guest

    И что это даст? Как бы некоторые сказали, у таблицы нет начала и конца, соответственно, и нет порядкового номера.
    Если Вы мазахист, то делайте.