Как сделать выбор и иметь возможность вернуться к значениям по умолчанию? - PullRequest
0 голосов
/ 11 апреля 2019

Надеюсь, я четко задаю этот вопрос .... если нет, пожалуйста, скажите мне, и я быстро пересмотрю.

Этот вопрос вращается вокруг моей таблицы настроек учетной записи (account_data) ... по существу, если учетная запись имеет запись в таблице, тогда настройка определяется ... если нет, тогда мне нужно загрузить значение по умолчанию (account_id нулевой). Структура таблицы:

     CREATE TABLE `account_data` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `account_id` int(11) DEFAULT NULL,
      `name` varchar(255) NOT NULL,
      `value` varchar(255) NOT NULL,
      `updated` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
      `created` datetime DEFAULT CURRENT_TIMESTAMP,
     PRIMARY KEY (`id`),
     UNIQUE KEY `id` (`id`),
     UNIQUE KEY `account_id_name` (`account_id`,`name`) USING BTREE,
     KEY `account_id` (`account_id`)
     ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Краткое примечание: account_id может быть (не определено) внешним ключом для таблицы счетов, столбца id.

Пример набора данных:

account_id | name | value
null | email_allowed | 0
1 | email_allowed | 1
null | persist_login | 0
null | homepage_version | small

Так что в настоящее время я делаю следующее, чтобы получить одно значение настройки для учетной записи ...

     SELECT * FROM account_data WHERE `name` = :name AND (account_id = :account_id OR account_id IS NULL) ORDER BY account_id DESC LIMIT 1

Кажется, это работает нормально ... если по какой-то причине это не очень хорошая идея, я бы хотел услышать почему. Однако, когда мне нужно получить все значения account_data для одной учетной записи, я делаю два запроса ...

    SELECT * FROM account_data WHERE account_id = :account_id

и

    SELECT * FROM account_data WHERE account_id is null

и затем объединить их в моем коде .... есть ли способ сделать это только одним запросом?

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Хитрость в том, что у вас нет всех настроек. Если не все значения по умолчанию, то это немного сложнее.

Как насчет запроса расстановки приоритетов?

select a.*
from account_data a
where account_id = :account_id
union all
select a.*
from account_data a
where account_id is null and
      not exists (select 1
                  from account_data ad2
                  where ad2.name = ad.name and
                        ad2.account_id = :account_id
                 );

Это должно получить все значения по умолчанию (которые не совпадают) плюс все настройки для учетной записи).

1 голос
/ 11 апреля 2019

Решением может быть создание нового столбца, содержащего значение по умолчанию, путем объединения таблицы над собой:

select
    ad1.account_id,
    ad2.name,
    ad1.value as accountValue,
    ad2.value as defaulValue
from
    account_data ad1 outer join
    account_data ad2 on (
        ad1.name = ad2.name and 
        ad1.account_id = :account_id and 
        ad2.account_id is null
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...