[MySQL] Занесение несколько значений в одну ячейку

Сообщения
657
Реакции
229
Помог
11 раз(а)
Добрый вечер

Возможно ли занести 2 и более значений в одну ячейку в строке в таблице

Правильно ли я делаю,
Я так полагаю, что нужно создать таблицу значением VARCHAR или можно обойтись INT?

Код:
new query[QUERY_LENGTH * 2], que_len;

que_len += formatex(query[que_len],charsmax(query) - que_len, "\
    CREATE TABLE IF NOT EXISTS %s \
    ( \
        `id` int(11) NOT NULL AUTO_INCREMENT, \
        `Auth` VARCHAR(32) NOT NULL default '',\
        `setting_1` VARCHAR(32) NOT NULL, \
        `setting_2` VARCHAR(32) NOT NULL \
        `setting_3` VARCHAR(32) NOT NULL,\
        PRIMARY KEY (`id`)\
    )\
    COLLATE='utf8_general_ci',\
    ENGINE=InnoDB,\
    AUTO_INCREMENT=3;"
);

new sData[EXT_DATA_STRUCT];
sData[EXT_DATA__SQL] = SQL_INITDB;
SQL_ThreadQuery(g_hDBHandle, "selectQueryHandler", query, sData, sizeof sData);
При подключении нового игрока выставляю следующее значение:
Код:
new query[QUERY_LENGTH * 2], que_len
    que_len += formatex(query[que_len],charsmax(query) - que_len, "INSERT INTO %s (`Auth`,\
    `setting_1`,\
    `setting_2`,\
    `setting_3`\
    )\
    VALUES\
    ('%s', \
    '0#0', \
    '0#0', \
    '0#0')\
    )", Auth)

    new sData[1];
    sData[0] = SQL_INGORE;
    SQL_ThreadQuery(g_hDBHandle, "selectQueryHandler", query, sData, sizeof sData);
я в голове примерное код занесение вынес, а именно
Код:
new query[QUERY_LENGTH * 2], que_len;

new query[QUERY_LENGTH * 2],que_len
    que_len += formatex(query[que_len],charsmax(query) - que_len, "\
        UPDATE `%s` SET \
            `setting_1` = '%d#%d', \
            `setting_2` = '%d#%d', \
            `setting_3` = '%d#%d', \
            WHERE `Auth` = '%s';"g_szRankTable,
            g_iSaveTemp[pId, 0], g_iSaveTemp[pId, 1],
            g_iSaveTemp[pId, 2], g_iSaveTemp[pId, 3],
            g_iSaveTemp[pId, 4], g_iSaveTemp[pId, 5],
            szAuth)

    sData[EXT_DATA__SQL] = SQL_SAVE;
    sData[EXT_DATA__INDEX] = id;
    sData[EXT_DATA__USERID] = get_user_userid(id);

    SQL_ThreadQuery(g_hDBHandle, "selectQueryHandler", query, sData, sizeof sData);
Как видите по коду в одной строке = '%d#%d' два массива (это g_iSaveTemp[pId, 0] и g_iSaveTemp[pId, 1], что следовательно храню два значения в одной ячейке разделяя решеткой. Правильно ли я делаю?


Вроде визуально представляя, я сохраняю ячейку, допустим все ОК.

а вот как выгрузить обратно, ведь SQL_ReadResult( Handle:query, column, {Float,_}:... ) возвращает одно значение в одном столбце
или можно как то отсеивать это значение и разделить путем правил "решетки", стоит решетка значит делим значение.

Прошу предоставить пример, если есть возможность
 
Последнее редактирование модератором:
Сообщения
162
Реакции
445
Помог
2 раз(а)
храню два значение в одном ячейке разделяя решеткой.Правильно ли я делаю?
Вряд ли. Зависит от того, что конкретно требуется, но наверняка есть способ лучше. Наверно, будет не лишним прочитать про нормализацию БД.
а вот как выгрузить обратно
Обратно выгружать как строку и потом парсить ее. Для этого есть функции strtok2, str_to_num, str_to_float и т.д.
 
Последнее редактирование:

Ayk

Сообщения
763
Реакции
476
Помог
19 раз(а)
setting_1 VARCHAR(32) NOT NULL, \ setting_2 VARCHAR(32) NOT NULL \ setting_3 VARCHAR(32) NOT NULL,\
Я думаю, раз уж ты сохраняешь числа (ибо у тебя %d), то поменяй строковый тип на числовой и сделай столько колонок сколько надо.
Вон, для бан-системы создают пару таблиц, не то что пара колонкок.
 
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
Limbooc, если у вас динамическое количество столбцов, то либо key-value делать либо json использовать. А еще лучше использовать специализирование key-value хранилищите по типу redis, mongodb и другие
 
Сообщения
657
Реакции
229
Помог
11 раз(а)
Ayk, врятли числовой, как говорил выше то '%d#%d' (решетка) уже как строковый.или я ошибаюсь
7 Окт 2019
fantom, можете привести пример?
 

Ayk

Сообщения
763
Реакции
476
Помог
19 раз(а)
Limbooc, о чём ты? Это ты числа форматируешь в строки. Я же предложил сразу числа сохранять:
Код:
        `setting_1` INT, \
        `setting_2` INT \
        `setting_3` INT,\
Код:
            `setting_1` = %d, \
            `setting_2` = %d, \
            `setting_3` = %d, \
 
Сообщения
657
Реакции
229
Помог
11 раз(а)
Ayk, ты наверно меня не понял, "решетка" действует как разделитель числа, типа : Число1#Число2, необходимо сделать так что бы при запросе с базы, запрос парсил два значения, а может и больше.... и записывал все в массивы\перемены
7 Окт 2019
Limbooc, об
Код:
`setting_1` = %d, \
            `setting_2` = %d, \
            `setting_3` = %d, \
не шла речь
а речь шла об
Код:
 `setting_1` = '%d#%d', \
            `setting_2` = '%d#%d', \
            `setting_3` = '%d#%d', \
 
Последнее редактирование модератором:
Сообщения
657
Реакции
229
Помог
11 раз(а)
fl0wer, На данный момент, пишу меню, в котором каждом пункте хранится 2-3 значения выбранном игроком, если все хранить БД простой INT, то число столбцов займет около больше > 36, с моей задумкой получается сразу в одном столбце хранится по 2 значения
 
Последнее редактирование модератором:
Сообщения
207
Реакции
420
Помог
10 раз(а)
А не проще в таком случае сделать таблицу вида:
  • SteamID (AuthID)
  • Key
  • Value
Где Key - название опции, а Value - её значение?
 
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
можете привести пример?
Пример чего? Данные способы расписаны в сотни тысячах статей написанных за многие годы.
7 Окт 2019
число столбцев займет около больше > 36, с моим задумкой получается сразу в одном стоблце хранится по 2 значение
И что 36 столбцов? Это лучше чем ради непонятного уменьшения их количества лепить костыли с разделителем.
Если вам известно заранее все свойства (не динамическая структура), то лучше создавайте такое количество столбцов сколько потребуется
 
Сообщения
197
Реакции
16
Помог
1 раз(а)
взялся бы какой-нибудь сишник и запилил бы функцию "sscanf " под amxx (отдельным модулем, или в ReAmxx), дак нет. в том же sa-mp.com разраб внедрил это, актуально как никогда
7 Окт 2019
тс, здесь нужен разделитель, но его нет. не занимайся ерундой, таблицы пока что бесплатные
 
Сообщения
1,667
Реакции
1,489
Помог
24 раз(а)
взялся бы какой-нибудь сишник и запилил бы функцию "sscanf " под amxx (отдельным модулем, или в ReAmxx), дак нет. в том же sa-mp.com разраб внедрил это, актуально как никогда
Разве в амхх этого нет?
 
Сообщения
657
Реакции
229
Помог
11 раз(а)
kucklovod, крч, затея тупая))...ок
 
Сообщения
197
Реакции
16
Помог
1 раз(а)
fl0wer, я чекал исходы amxx, не нашел. если есть, супер
 
Сообщения
144
Реакции
276
Помог
1 раз(а)
Я конечно не эксперт по MySQL, но разве ему не пофиг, сколько у вас столбцов в таблице ? Выборка идет по строкам.

Во вторых, если речь идет о функции Вкл\Выкл, то можно использовать флаги, записывая их в строковуя ячейку БД и конвертируя на уровне амх в битсумму (read_flags(szFlags) / get_flags(flags, output[], len)), чтобы в БД было визуально понятно. Пользуюсь таким способом давно, по моему его ещё никто не просек :blush2:
.
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу