Я создаю модуль предпочтений для системы, чтобы пользователи могли определять свои собственные предпочтения для определенных частей (например, планировка, цветовая схема, рабочий стол и т. Д.). Каждое предпочтение в таблице имеет значение по умолчанию (в случае, если пользователь еще не определил его), и как только пользователь изменит свои предпочтения, система должна использовать это пользовательское значение.
У меня возникают проблемы с выбором требуемого значения, мой запрос работает с определяемым пользователем значением, но, к сожалению, он возвращает значение null
когда пользователь еще не определил предпочтение.
У меня есть 2 стола
table **preferences**: id name default_value table **preferences_defined**: id preference_id user_id defined_value
Я хочу создать функцию, чтобы легко выбрать желаемое значение, указав user_id человека, которому применено предпочтение, и имя предпочтения. В настоящий момент мой запрос выглядит так:
SELECT IF(ISNULL(defined_value),default_value,defined_value) AS result FROM preferences LEFT JOIN preferences_defined ON preferences_defined.id = preferences.id WHERE user_id = 17 AND name = "menu_items"
Я предполагаю, что WHERE user_id = 17
– это то, что происходит неправильно, потому что, когда нет определенного значения, это означает, что также нет столбца с именем user_id. Мне нужно найти способ сделать эту работу. Таким образом, мне нужно выбрать определенное значение, если оно существует (с учетом user_id
и name
предпочтения), если нет, он должен будет вернуть значение по умолчанию.
WHERE (user_id = 17 OR user_id IS NULL) AND name = "menu_items"
И просто для очистки остальной части запроса:
Определенный id
в настройках не должен быть там, вместо этого используйте комбинированный ключ preference_id
и user_id
.
Если id
preferences
был назван preference_id
, длинный оператор ON
можно заменить USING(preference_id)
Функция IF
может быть заменена COALESCE(defined_value, default_value)
Если я, где вы, я бы сделал один / два запроса.
Таким образом, вы получите:
$query = "SELECT * FROM preferences_defined WHERE user_id = 17 AND name = 'menu_items'"
А затем в PHP:
$rows = mysql_num_rows($query); if($rows == 0){ $query = "SELECT * FROM preferences WHERE name = 'menu_items'"}
Таким образом, ваш правильный запрос всегда будет в $ query var. Надеюсь это поможет!