Ant*_*nin 7 sql postgresql node.js sequelize.js
我有一张Users与一对多关系的桌子Userlang.例如:
userlang.id userlang.userid userlang.lang
+-----------+---------------+-------------+
1 1 EN
2 1 FR
3 1 IT
4 2 EN
5 2 DE
6 3 IT
Run Code Online (Sandbox Code Playgroud)
我想选择所有的用户和他们的userlangs有至少一个userlang.lang=EN.
所以,我不能使用以下查询:
Select USERS.id from USERS inner join USERLANG on USERS.ID=USERLANG.USERID where USERLANG.LANG="EN"
Run Code Online (Sandbox Code Playgroud)
因为它只选择Userlangs带有a 的行lang="EN",而我想选择userlang每个用户的所有行,其中至少有一行lang="EN"
我已经能够用SQL以两种方式编写这样的查询:
Select *
from USERS inner join USERLANG on USERS.ID=USERLANG.USERID
where USERS.ID in (
Select USERS.id
from USERS inner join USERLANG on USERS.ID=USERLANG.USERID
where USERLANG.LANG="EN"
)
Run Code Online (Sandbox Code Playgroud)
虽然内部查询将仅选择userlang行lang="EN",但外部查询将为userlangs这些用户选择all .
Select *
from USERS innerjoin USERLANG as FILTER on FILTER.userid=USERS.userid
inner join USERLANG on USERLANG.userid=FILTER.userid
where FILTER.lang="EN"
Run Code Online (Sandbox Code Playgroud)
我完全无法在sequelize上编写子查询:我想避免编写纯SQL,因为它可能会打开可能的注入攻击.
这是我失败的尝试,因为'FILTER'与USer没有关系而产生错误:
models.User.findAll({
include:[models.Userlang,{model:models.Userlang,as:'FILTER'}]
})
Run Code Online (Sandbox Code Playgroud)
select userid,lang
from t
where userid in (
select userid
from t where lang="en"
group by userid having count(lang)>=1)
select a.userid,a.lang
from t a left join ( select userid,lang from t where lang ="en") b
on a.userid=b.userid
where b.lang is not null
Run Code Online (Sandbox Code Playgroud)
不确定您的问题是什么,但也可以通过分两步获得相同的结果;将子查询替换为 temptable。
| 归档时间: |
|
| 查看次数: |
1700 次 |
| 最近记录: |