В MySQL нет функции разбиения / разбиения строк, как в PHP или во многих других языках.
Он может разбить строку на разделитель, но не позволяет вам получить доступ к каждому элементу массива почти так же легко. Вы говорите, что заполняете раскрывающийся список в графическом интерфейсе. Будет ли проще использовать язык графического интерфейса, который, скорее всего, имеет более простую в управлении функцию разделения строк?
В настоящее время я не могу придумать, как вернуть каждый элемент в виде строки, но только как вернуть каждое значение в отдельном столбце в возвращенном наборе записей.
Вам нужно будет создать собственную «функцию» в вашем запросе. Дайте мне посмотреть, смогу ли я показать вам пример, а затем дать больше объяснений, чем показано в большинстве хитов, которые я нашел за несколько минут просмотра. ВНИМАНИЕ: поскольку в вашем примере может быть 1, 2, 3 ... n «элементов», вам придется по-настоящему творчески подходить к работе с дубликатами. - Если вы настроили свой запрос на получение четырех элементов из строки, содержащей три значения, третье и четвертое возвращенные значения будут одинаковыми.
Большинство примеров, которые я обнаружил за последние несколько минут, отлично справляются со свободным переключением положительных и отрицательных чисел, а затем оставляют вам попытаться понять, как / почему / когда переключаться с положительного на отрицательный.
Для скольких элементов вы ожидаете получить максимум, используйте это как модель:
SELECT ...,
SUBSTRING_INDEX(SUBSTRING_INDEX(guid, '.', n), '.', -1) as xxx,
...
FROM my_table
MySQL обрабатывает функции, как вы делаете в алгебре - сначала начните обрабатывать внутренние скобки, а затем выходите из положения.
Внутренняя часть этой функции (SUBSTRING_INDEX (guid, '.', N)) разбивает строку на '.' разделитель, а затем держится за первые "n" частей. Внешняя часть функции разбивает то, что она хранит в памяти, а затем возвращает последнюю (-1) часть.
Используя эту модель, вы можете намного легче следить за тем, как это работает, и еще лучше помнить, что вы делаете сейчас, когда видите этот код месяцами.
SELECT ...,
SUBSTRING_INDEX(SUBSTRING_INDEX(guid, '.', 1), '.', -1) as guid_1,
SUBSTRING_INDEX(SUBSTRING_INDEX(guid, '.', 2), '.', -1) as guid_2,
SUBSTRING_INDEX(SUBSTRING_INDEX(guid, '.', 3), '.', -1) as guid_3,
SUBSTRING_INDEX(SUBSTRING_INDEX(guid, '.', 4), '.', -1) as guid_4,
SUBSTRING_INDEX(SUBSTRING_INDEX(guid, '.', 5), '.', -1) as guid_5,
...
FROM my_table
Обработка дубликатов в запросе будет очень запутанной. Вот что нужно, чтобы вернуть пустую строку для пятого элемента строки только с четырьмя элементами:
IF(substring_index(SUBSTRING_INDEX(guid, '.', 4), '.', -1) !=
SUBSTRING_INDEX(SUBSTRING_INDEX(guid, '.', 5), '.', -1),
SUBSTRING_INDEX(SUBSTRING_INDEX(guid, '.', 5), '.', -1),
'') as guid_5
Вы можете немного упростить это, создав пользовательскую функцию на вашем сервере MySQL, если администратор сервера разрешает это. Я бы создал следующую функцию:
create function MY_SUBSTRING (
search_string text,
delimiter_chars varchar(1),
string_index int
)
RETURNS varchar(128) DETERMINISTIC
BEGIN
# FIRST ARRAY ELEMENT IS INDEX 1, NOT INDEX 0
RETURN SUBSTRING_INDEX(SUBSTRING_INDEX(search_string, delimiter_chars, string_index), delimiter_chars, -1);
END $
Это даст вам немного чистого и многократно используемого кода, который сделает этот и другие запросы чище, такие как
SELECT ...,
MY_SUBSTRING(guid, '.', 1) as guid_1,
MY_SUBSTRING(guid, '.', 2) as guid_2,
MY_SUBSTRING(guid, '.', 3) as guid_3,
MY_SUBSTRING(guid, '.', 4) as guid_4,
MY_SUBSTRING(guid, '.', 5) as guid_5,
...
FROM my_table
К сожалению - Я только что увидел, что вы хотели использовать результаты в качестве подзапроса. Это еще один червячный червь, и ему нужен кто-то, у кого есть идея переместить результат из столбцов в строки. По крайней мере, я надеюсь, что это поможет вам лучше понять функцию SUBSTRING_INDEX.
Вы могли бы хотеть попытаться добавить что строка к Вашему любить к /etc/rc.local
Это не может быть достаточно скоро, хотя, так как rc.local назовут после gdm.
Также отметьте, значение по умолчанию runlevel на Ubuntu равняется 2, не 3. Ваша ссылка в rc3.d, вероятно, не работала просто потому что Вы где не использование runlevel 3. Значение по умолчанию runlevel является установкой/etc/event.d/rc-default
Я использовал этот метод для достижения этого прежде, но на Дуге Linux. Теперь, я не слишком знаком с init системой использование Ubuntu, но я предполагаю, что Вы могли попытаться адаптировать это к Ubuntu.
Я полагаю, что сценарии запуска Ubuntu уже включают "alsactl восстановление". Необходимо смочь уже выполнить "alsactl хранилище" с объемом набор к 25% и влиять на все будущие перезагрузки.
Ах, да, но есть ли в них «хранилище alsactl» при выключении?
Что вы можете сделать, так это написать сценарий для уменьшения громкости при выключении компьютера. Примерно так:
#!/bin/sh
amixer -- sset Master playback -40dB
exit 1
затем запустите этот сценарий при завершении работы.
Rob,
Я пытаюсь решить тот же вопрос. Я воспользовался вашей фразой "amixer", приведенной выше, и проделал много работы, изучая уровни выполнения, папки /etc/rc#.d и команду update-rc.d. Это не идеально. Он все еще не запускается при перезагрузке так, как я бы хотел, но это уже начало.
Предложения по его улучшению будут приветствоваться.
И вот мой код ниже.....
sudo echo "#!/bin/bash" > /etc/init.d/lowvol.sh
sudo echo "/usr/bin/amixer -c 0 sset Master,0 35% > /dev/null" >> /etc/init.d/lowvol. sh
sudo chmod +x /etc/init.d/lowvol.sh
sudo chown root:root /etc/init.d/lowvol.sh
sudo update-rc.d lowvol.sh stop 20 0 6 .