我有以下表结构:
user: user_id|user_name
1 |John Doe
2 |Alex
data: data_id|data_kind|data_value
1 |123 |Hello
2 |456 |World
3 |123 |GoodBye
UNIQUE(data_kind, data_value)
user_data: user_id|data_id
1 |1
1 |2
2 |3
2 |2
UNIQUE(user_id, data_id)
INDEX(data_id)
我如何能够查询具有 (data_kind=123,data_value='Hello') 和 (data_kind=456,data_value='World') 的所有用户(John Doe)?
即使
data
表中存在唯一约束,多对多
关系表 user_data
不会阻止与同一用户相关的多行数据。
为了防止潜在的重复数据,查询可以采用以下形式:
select *
from user u
where exists (
select 1 from user_data ud
join data d on d.data_id = ud.data_id
where ud.user_id = u.user_id
and d.data_kind = 123 and d.data_value = 'Hello'
) and exists (
select 1 from user_data ud
join data d on d.data_id = ud.data_id
where ud.user_id = u.user_id
and data_kind = 456 and data_value = 'World'
)