mysql在nodejs中search子节点和父节点表字段

在我的Node应用程序中,我们使用Sequelize来连接mysql有两个表UserUserOption

User表有以下字段

 user_id(pk) user_email 

UserOption表有以下字段

 option_id(pk) user_id(fk) first_name 

我需要通过search文本在user_emailfirst_name列出所有用户是否有任何选项在user_email中search父&子表格字段?

UPDATE

User

 user_id user_email 1 text@text.com 2 anything@anything.com 3 jhon@smthng.com 

UserOption

 option_id user_id first_name 1 1 jhon 2 2 smith 3 3 david 

如果我search“jhon”,结果将是id为1和2的用户

您需要在模型User中查找include模型UserOption 。 这将生成一个条件为UserOption.user_id = User.user_idJOIN子句,并添加指定的WHERE子句以在两个表的user_emailfirst_name列上执行文本查找

 User.findAll({ where: { user_email: { $like: '%text%' } }, include: [ { model: UserOption, where: { first_name: { $like: '%text%' } }, attributes: [] } ] }).then((users) => { // result }); 

编辑

基于你更新的问题,我认为你可以尝试使用sequelize.literal方法,但根据文档:

创build一个表示文字的对象,即不会被转义的东西。

所以有必要自己逃避所需的价值

 let escValue = sequelize.escape(lookupText); User.findAll({ where: { $or: [ { email: { $like: '%' + lookupText + '%' }, { id: { $in: sequelize.literal(`(SELECT uo.user_id FROM user_options uo WHERE uo.first_name LIKE CONCAT('%', ${escValue}, '%'))`) } ] } }).then((users) => { // result... }); 

它将生成一个查询,从users表中select用户email LIKE '%text%'或其中users.id位于指定查询结果中的users表。

我很好奇,如果这符合您的需求,等待反馈。