PDA

Просмотр полной версии : [Вопрос] Создание индексов в базе данных (MySQL)



Elrmrnt-Kritik
04.01.2018, 02:28
Доброй ночи всем пользователям. В процессе изучения баз данных (MySQL) узнал о существовании индексов. Помимо того, что они упрощают поиск чего-либо в базе данных системе, они также удобны и в работе с базой данных пользователями. Правда столкнулся с небольшой проблемой, решение который не смог найти. Допустим, есть две таблицы в базе данных:


==========ACCOUNTS==========
id name
1 Oleg
2 Dima
3 Sasha
4 Serega
5 Timofey
==========BANLIST===========
id1 name1 id2 name2
1 Oleg 5 Timofey
2 Dima 5 Timofey
3 Sasha 5 Timofey
4 Serega 3 Sasha

Моя задача научиться делать так, чтобы из мода не шли лишние запросы на "вписку" имени пользователя. Непосредственно столбцы name1 и name2 созданы лишь для удобства (мне) поиска пользователя (чтобы из базы данных было проще понять кто есть кто и можно было выполнять все необходимые операции без постоянного обращения к таблице accounts).

На данный момент реализован индекс, который связывает `banlist`.`id1` с `accounts`.`id`, а также `banlist`.`id2` с `accounts`.`id`.

Может немного сложно объяснил, но надеюсь на помощь)
Извините, если не в том разделе создал тему...

DeimoS
04.01.2018, 04:39
Ещё раз, что тебе нужно получить в результате? И какие данные есть изначально?

Elrmrnt-Kritik
05.01.2018, 23:57
Ещё раз, что тебе нужно получить в результате? И какие данные есть изначально?

Ох, даже не знаю как объяснить...

Имеются две таблицы: table1 и table2.

В table1 прописаны уникальные значения ID пользователя. И на каждое уникальное значение ID в этой же таблице есть одно уникальное имя (name). Соответственно, если нужно что-то изменить конкретному человеку, я могу использовать как уникальный ключ поиска (после WHERE) и ID, и name (не беру во внимание сейчас, что для MySQL сравнение строк дольше).

Далее, в table2 хранятся какие-то еще сведения о каждом человеке. Там есть один уникальный ключ (ID). И все операции выполнять с помощью него (SELECT/UPDATE/DELETE ... WHERE `id` = '...'). Если, например, по какой-либо причине ID у игрока может смениться (ну, кто его знает, зачем это может понадобиться :don-t_mention:) в основной таблице (table1), то было бы здорово, если б ID в table2 также автоматически заменился. Для этого я создал индекс, который связывает `table1`.`id` и `table2`.`id`.
Собственно, теперь к проблеме. Крайне неудобно работать с каким-либо человеком, не видя перед глазами ID. А выискивать сначала ID в table1 по известному имени, а затем еще в table2 искать этот ID - то же не самый приятный способ. Потому хотелось бы, чтобы в table2 тоже существовало поле name. Однако, оно не должно заполняться содержимым мною лично и сервером. Было бы здорово, чтобы поле `table2`.`name` заполнялось автоматически в зависимости от `table2`.`id`. По факту, я пытаюсь создать внутреннюю связь между `table1`.`id` и `table1`.`name`, а затем в table2 получить значение `table2`.`name` в зависимости от `table2`.`id`.

Короче, как-то надо по связанному через индексы ID получить имя пользователя...

ziggi
06.01.2018, 00:54
Вообще не понял проблемы. Тебе в phpmyadmin неудобно что-ли смотреть? Или ты всё-же пытаешься запрос какой-то сделать?

Elrmrnt-Kritik
06.01.2018, 00:56
Тебе в phpmyadmin неудобно что-ли смотреть?

Да. Я пытаюсь синхронизировать ID и name в одной таблицы, чтобы в другой по ID получить имя без всяких запросов (чтобы MySQL автоматически вставлял имя в поле).

ziggi
06.01.2018, 01:09
Да. Я пытаюсь синхронизировать ID и name в одной таблицы, чтобы в другой по ID получить имя без всяких запросов (чтобы MySQL автоматически вставлял имя в поле).

Любое дублирование данных в базе - это плохо.
С помощью SQL можно создавать намного более сложные запросы, чем ты думаешь, посмотри по своей теме:
- https://toster.ru/q/26573
- https://ru.stackoverflow.com/questions/509004/ыборка-из-связанных-таблиц-mysql

Kucklovod00
07.01.2018, 01:22
Как я понял, это таблица accounts и accounts2. Что мешает создать строку (назовем это так) в обеих таблицах сразу?
Если глупость, просьба проигнорировать.

Elrmrnt-Kritik
07.01.2018, 02:19
Нет) Это все таблицы, где присутствуют записи о двух игроках. Такие как бан-лист (кто и кому выдал бан), логи, которые должны показываться на сайте (кто, кому и что передал) и все в этом роде. Я очень не хотел посылать запрос на внесение имени в таблицы такого типа. Хотел привлечь к этой работе систему.

Пожалуй, воздержусь от удобства и последую словам ziggi, мол, дублирование не есть хорошо. Не стану это делать. Однако, все же интересно понять, можно ли заставить phpmyadmin саму вписать имя в зависимости от ID. Если в одной таблице у ID 5 имя "nik", то в другой, где вписывается ID 5 с сервера через INSERT, автоматически должно вписаться в поле name "nik".

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

Geebrox
07.01.2018, 03:53
Пожалуй, воздержусь от удобства и последую словам ziggi, мол, дублирование не есть хорошо. Не стану это делать. Однако, все же интересно понять, можно ли заставить phpmyadmin саму вписать имя в зависимости от ID. Если в одной таблице у ID 5 имя "nik", то в другой, где вписывается ID 5 с сервера через INSERT, автоматически должно вписаться в поле name "nik".

INSERT INTO `banlist` (`id_1`, `name_1`, `id_2`, `name_2`) VALUES ('ПЕРВЫЙ_ИД', (SELECT `name` FROM `accounts` WHERE `accounts`.`id` = 'ПЕРВЫЙ_ИД'), 'ВТОРОЙ_ИД', (SELECT `name` FROM `accounts` WHERE `accounts`.`id` = 'ВТОРОЙ_ИД'))

Вот так можно (если я тебя правильно понял), нужно только знать id обеих игроков

DeimoS
07.01.2018, 09:50
Пожалуй, воздержусь от удобства и последую словам ziggi, мол, дублирование не есть хорошо. Не стану это делать. Однако, все же интересно понять, можно ли заставить phpmyadmin саму вписать имя в зависимости от ID. Если в одной таблице у ID 5 имя "nik", то в другой, где вписывается ID 5 с сервера через INSERT, автоматически должно вписаться в поле name "nik".

Автоматически - вряд ли (разве что через связи, но получится тупо). Можно связать таблицы и потом парой нажатий перейти к основному аккаунту, но для чего это нужно? Влезать в базу данных из phpMyAdmin чтоб что-то изменить - не самая лучшая идея. А если уж очень хочется, лучше научиться писать запросы и, собственно, составив один простой запрос и обратившись к двум таблицам, получить ник

Elrmrnt-Kritik
07.01.2018, 12:23
Автоматически - вряд ли (разве что через связи, но получится тупо). Можно связать таблицы и потом парой нажатий перейти к основному аккаунту, но для чего это нужно? Влезать в базу данных из phpMyAdmin чтоб что-то изменить - не самая лучшая идея. А если уж очень хочется, лучше научиться писать запросы и, собственно, составив один простой запрос и обратившись к двум таблицам, получить ник

Что-то вроде этого?


UPDATE `table2` SET `name` = (SELECT `name`FROM `table1` WHERE `id` = '%d' LIMIT 1) WHERE `id` = '%d' LIMIT 1


Хотя, что спрашивать, так ведь правильно) Наверное, закройте, пожалуйста, тему... Всем спасибо большое.

DeimoS
07.01.2018, 13:01
Что-то вроде этого?


UPDATE `table2` SET `name` = (SELECT `name`FROM `table1` WHERE `id` = '%d' LIMIT 1) WHERE `id` = '%d' LIMIT 1


Хотя, что спрашивать, так ведь правильно) Наверное, закройте, пожалуйста, тему... Всем спасибо большое.

Только если в скриптах пишешь запросы, а не для использования в phpMyAdmin, то всё же лучше работать через id сразу, а не через ник (если сама система позволяет делать подобное: например, игрок, с которым нужно действия произвести, онлайн). Сравнить число всё же проще, нежели строку, в которой этих чисел в несколько раз больше