基于PostgreSQL中的单独表数据执行搜索

基于PostgreSQL中的单独表数据执行搜索,postgresql,Postgresql,我有一张这样的桌子: deals id vendorid name 1 52 '25% Off' 2 34 '10% Off' - 我正在尝试搜索数据库,该数据库也基于供应商id进行搜索 我可以这样做以获取查询中的供应商数据: SELECT *, (SELECT json_agg(vendors.*) FROM vendors WHERE deals.vendorid = vendors.id) as vendor F

我有一张这样的桌子:

deals
id     vendorid     name
1      52           '25% Off'
2      34           '10% Off'
-

我正在尝试搜索数据库,该数据库也基于供应商id进行搜索

我可以这样做以获取查询中的供应商数据:

SELECT *,
(SELECT json_agg(vendors.*) FROM vendors WHERE deals.vendorid = vendors.id) as vendor
FROM deals
现在我想添加一个搜索到它,这里有一些我尝试

SELECT *,
(SELECT json_agg(vendors.*) FROM vendors WHERE deals.vendorid = vendors.id) as vendor
FROM deals
WHERE vendor.name ILIKE '%wal%'
在上面的示例中,用户将开始搜索
walmart
,但是它说vendor.name列不存在,正确的方法是什么

我期望上述查询的输出是:

[
 {
   id: 1,
   vendorid: 52,
   name: '25% Off',
   vendor: [
      {
        id: 52,
        name: 'Walmart'
      }
   ]
 }
]
您需要的查询

drop table if exists deals;
drop table if exists vendors;

create table if not exists deals(
  id serial, 
  vendorid int not null, 
  name varchar not null
); 

create table if not exists vendors(
  id serial,
  name varchar not null
);

insert into deals values 
(1,52,'25% off'), 
(2,34,'10% off');

insert into vendors values 
(52,'Walmart'),
(34,'Home Depot');


select 
    d.id,
    d.vendorid,
    v.name,
    json_agg(v.*)
from 
    vendors v 
left join 
    deals d on d.vendorid = v.id
where 
    --v.id=52 and
    v.name ILIKE '%wal%'
group by 
    d.id,
    d.vendorid,
    v.name;
如果您运行的是9.3+版本的postgres,您可以使用postgres提供的一个强大功能:

检查它是如何工作的


享受博士后的力量。

我能用这个完成它

SELECT 
      *,
      (SELECT json_agg(vendors.*) FROM vendors WHERE deals.vendorid = vendors.id) as vendor
    FROM 
      deals
    where (SELECT json_agg(vendors.*) FROM vendors WHERE deals.vendorid = vendors.id).name ILIKE '%wal%'

这很难看,但要把工作做完。我对postgree不太熟悉,但您可以将其存储在变量中。

您的
供应商
查询没有返回名为
名称
的列,因此您不能在查询中使用它。为什么不在内部查询中使用它呢<代码>其中deals.vendorid=vendors.id和vendors.name类似“%wal%”…我正在尝试获取交易列表,json_agg函数将供应商数据附加到交易中,这样我就可以在不单独查询每笔交易的情况下输出它。确定,但是您知道,
vendor.name
不存在,因为您没有返回该列,对吗?是的,我知道了,我不知道解决方法是什么,您期望的输出是什么。这将有助于澄清这样一个问题:在这种情况下,我如何将其用于另一个表中的数据?文档中没有提供这方面的示例。要使用另一个表中的数据,只需连接表,因为表之间有链接(vendorid)。我编辑了我的答案以添加您要查找的查询。对于全文搜索实现,必须更改where子句。如果你想用的话,我可以起草一些东西。这很有效,而且速度很快,是的,我想知道是否有办法浓缩它
SELECT 
      *,
      (SELECT json_agg(vendors.*) FROM vendors WHERE deals.vendorid = vendors.id) as vendor
    FROM 
      deals
    where (SELECT json_agg(vendors.*) FROM vendors WHERE deals.vendorid = vendors.id).name ILIKE '%wal%'