【问题标题】:Select from table where all array elements are in any of two fields从所有数组元素都在两个字段中的任何一个中的表中选择
【发布时间】:2016-02-03 09:05:03
【问题描述】:

我有两个通过 fkey 连接的表(一对多关系)。第一个表包含记录的名称。第二个表包含有关记录的注释。显然这些表也有其他字段,但它们与情况没有任何关系。用户输入一串关键字。输入作为数组 $keywords 传递给函数。在这个函数中,我想找到那些包含 all 关键字的记录。一些关键字可能在第一个表中找到,而另一些则在第二个表中。更具体地说:

table family (family_id, family_lastname)
table members (member_id, family_id, member_firstname, notes)

family_idmembers 的 p_key 和 family 的 f_key。 family_idfamily 的 p_key。

如果我想搜索一个知道他部分姓氏的人(因为他可能是 Alejandro Gonzalez Inarritu,所以我可以通过 Gonzalez 或 Inarritu 进行搜索)或备注字段中的一些其他数据,那么我想在两个字段中搜索 - family_lastname 和 notes,查看是否所有关键字都属于此人,并返回他的 id (member_id)。

我很确定您可能有很多问题,例如 - 为什么不为姓氏和注释等创建单独的字段,但是了解数据的全部性质,应该这样做。

到目前为止,我正在发布查询,这显然不起作用,甚至不接近我想要实现的目标。

SELECT member_id FROM members WHERE notes = %$keywords% OR family_id = (SELECT family_id FROM family WHERE family_lastname = %$keywords%);

如果我只有一个关键字,这会得到正确的结果。我想对每个关键字执行此查询,然后加入这些结果。

postgres 版本是 9.2++,所以请随意使用任何花哨的功能。另外,我希望不要使用除查询本身之外的任何其他工具(例如函数)。我希望在查询中完成整个工作。

【问题讨论】:

    标签: postgresql select join


    【解决方案1】:

    要连接两个表,您可以使用左连接。要从列表中选择,您可以使用关键字any

    SELECT member_id FROM members m LEFT JOIN family f on f.family_id=m.family_id WHERE notes in ($keywords) and family_lastname in ($keywords);
    

    【讨论】:

    • 但我不需要任何关键字。我需要将它们全部包含在内,即使其中一些包含在其中一个表中,而其余部分包含在另一个表中。
    • 在这种情况下,您必须使用 in 运算符和“and”而不是“or”(请参阅​​更新的响应)
    猜你喜欢
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    相关资源
    最近更新 更多