user
---------------------------
userid name
---------------------------
1 ...
2 ...
3 ...
item
---------------------------
itemid category
---------------------------
1 ...
2 ...
3 ...
request
---------------------------
requestid itemid userid
---------------------------
1 ... ...
2 ... ...
3 ... ...
Я хочу получить все категории в таблице элементов, которые равны категориям в таблице запросов определенного пользователя.
например, пользователь запрашивает элемент с категорией «математика», я хочу получить все элементы в таблице элементов с категорией «математика».
Вы можете сделать это с помощью соединений:
select i1.*
from request r
inner join item i on r.itemid = i.itemid
inner join item i1 on i1.category = i.category
where r.userid = ?
Логика заключается в том, чтобы выбрать все запросы с заданным идентификатором пользователя и вывести соответствующие элементы. Затем вы можете присоединиться еще раз для предметов, принадлежащих к той же категории.
В зависимости от ваших данных это может привести к дублированию. Если это так, exists
, вероятно, более уместно:
select i1.*
from item i1
where exists (
select 1
from request r
inner join item i on r.itemid = i.itemid
where r.userid = ? and i.category = i1.category
)
i1
— это псевдоним таблицы дляitem
.i1.*
выбирает все столбцы этой таблицы.