У меня есть следующая структура таблицы.
USERS
PROPERTY_VALUE
PROPERTY_NAME
USER_PROPERTY_MAP
Я пытаюсь получить пользователя /s из таблицы USERS
, которые имеют соответствующие свойства в таблице PROPERTY_VALUE
.
Один пользователь может иметь несколько свойств. Пример данных здесь имеет 2 свойства для пользователя '1', но может быть больше 2. Я хочу использовать все эти пользовательские свойства в предложении WHERE
.
Этот запрос работает, если у пользователя есть одно свойство, но он терпит неудачу для более чем 1 свойства:
SELECT * FROM users u
INNER JOIN user_property_map upm ON u.id = upm.user_id
INNER JOIN property_value pv ON upm.property_value_id = pv.id
INNER JOIN property_name pn ON pv.property_name_id = pn.id
WHERE (pn.id = 1 AND pv.id IN (SELECT id FROM property_value WHERE value like '101')
AND pn.id = 2 AND pv.id IN (SELECT id FROM property_value WHERE value like '102')) and u.user_name = 'user1' and u.city = 'city1'
Я понимаю, поскольку запрос имеет pn.id = 1 AND pn.id = 2
, он всегда терпит неудачу, потому что pn.id
может быть либо 1, либо 2, но не одновременно. Итак, как я могу перезаписать его, чтобы он работал для n количества свойств?
В приведенных выше примерах данных есть только один пользователь с id = 1
, который имеет оба свойства соответствия, используемые в предложении WHERE
. Запрос должен возвращать одну запись со всеми столбцами таблицы USERS
.
Чтобы уточнить мои требования
Я работаю над приложением, которое имеет страницу списка пользователей в пользовательском интерфейсе, в которой перечислены все пользователи в системе. В этом списке есть информация, такая как идентификатор пользователя, имя пользователя, город и т.д. - все столбцы таблицы USERS
. Пользователи могут иметь свойства, указанные в приведенной выше базе данных.
Страница списка пользователей также предоставляет функции для поиска пользователей на основе этих свойств. При поиске пользователей с двумя свойствами "свойство1" и "свойство2" страница должна отображать и отображать только соответствующие строки. Основываясь на данных теста выше, только пользователь "1" подходит к счету.
Доступен пользователь с 4 свойствами, включая свойства 'property1' и 'property2'. Но пользователь с единственным свойством property1 будет исключен из-за отсутствующего свойства property2.