MySQL - Как мне двунаправленно связать настраиваемую таблицу с пользовательскими и пользовательскими таблицами метаданных? - Wordpress - PullRequest
1 голос
/ 28 мая 2020

Я использую Wordpress, PhpMyAdmin, MySQL. Я также новичок, когда дело доходит до SQL и баз данных, так что несите меня.

У меня есть настраиваемая таблица данных (это основная таблица пользовательской информации) , которая Я хочу иметь двунаправленную связь с таблицами wp_users и wp_usermeta - это означает, что если пользователь обновляет свой профиль (таблицы Users или Usermeta), то настраиваемая таблица данных будет автоматически обновляться без необходимости вручную вводить их обновленную информацию.

Точно так же, если я редактирую таблицу пользовательских данных, я хочу, чтобы соответствующая информация в Users и Usermeta автоматически обновлялась.

Я попытался создать приблизительную диаграмму того, что у меня в голове. Схема обработки данных

Текущая система ужасна и очень сложна в обслуживании. Другая проблема заключается в том, что существует множество отчетов SQL, в которых используется текущая настраиваемая таблица данных. Я понимаю, что решение, которое я ищу, скорее всего, означает создание совершенно новой таблицы. Все нормально.

       User
–––––––––––––––––––
| ID  | username  |
|–––––+–––––––––––|
| 376 | John      |
| 377 | Paul      |
| 378 | Ringo     |
–––––––––––––––––––

       Usermeta
–––––––––––––––––––––––––––––––––––––––––––––
| meta_id | user_id | meta_key | meta_value |
|–––––––––+–––––––––+––––––––––+––––––––––––|
| 8       | 1       | job      | Keys       |
| 102     | 2       | job      | Vocals     |
| 203     | 3       | job      | Drums      |
–––––––––––––––––––––––––––––––––––––––––––––

       Custom_Table
––––––––––––––––––––––––––––––––––––––
| ID | username  | job     | user_ID |
|––––+–––––––––––+–––––––––+–––––––––|
| 1  | John      | Keys    | 376     |
| 2  | Paul      | Vocals  | 377     |
| 3  | Ringo     | Drums   | 378     |
––––––––––––––––––––––––––––––––––––––

По сути, это то, что у меня есть запрос (за исключением того, что у меня гораздо больше строк пользовательской меты) :

CREATE TABLE custom_table
    SELECT users.username,
    MAX(CASE WHEN meta_key = 'job' THEN meta_value ELSE NULL END) AS job,
    users.ID
    FROM wp_users as users, wp_usermeta as umeta
    WHERE umeta.user_id = users.ID

Это создает таблицу I хотите, но если какая-либо из таблиц обновлена, она больше нигде не синхронизируется. Это возможно? Будет ли это сделано с помощью какого-то триггера (я все еще не знаком с триггерами)?

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Просто используйте представление вместо таблицы. Это дает вам всегда актуальную перспективу ваших фактических данных без каких-либо затрат на обслуживание (и, если это стоит, без затрат на хранение).

create view custom_view as 
select 
    u.username, 
    um.meta_value as job
    u.id as user_id
from wp_users as users u
left join wp_usermeta as umeta um on um.user_id = u.ID and um.meta_key = 'job'

Примечание относительно вашего исходного запроса:

  • это фактически недействительно SQL (отсутствовало предложение group by)

  • событие, если оно имело предложение group by, он будет отфильтровывать пользователей без работы (что может быть не тем, что вам нужно).

  • не использовать старые неявные объединения; всегда используйте стандартные объединения (с ключевым словом on и без запятой в предложении from)

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

0 голосов
/ 28 мая 2020

Вы можете использовать Обновляемый VIEW, чтобы решить эту проблему:

CREATE VIEW custom AS
  SELECT User.ID, User.username,
    CASE WHEN meta_key = 'job' THEN meta_value ELSE NULL END AS job
  FROM User INNER JOIN Usermeta ON Usermeta.user_id = User.ID

демо на dbfiddle.uk

Чтобы представление было обновляемым, между строками в представлении и строками базовой таблицы должно быть взаимно однозначное отношение. Есть также некоторые другие конструкции, которые делают представление необновляемым.

Если вам нужна одна из конструкций, вы можете только создать VIEW и обновить исходные таблицы. сам. Представление всегда синхронизируется с исходными таблицами.

...