我有一些记录有关于商店的信息。这些记录有几个不同的嵌套字段。其中一个嵌套字段是标签,一个是员工。我试图计算具有标签的商店数量和具有特定名称的员工数量。所以我这样做了:
SELECT count(*)
FROM [stores.stores_844_1]
where tags.tag_name='foo'
and employees.first_name='bar'
然后我收到错误:
Error: Cannot query the cross product of repeated fields tags.tag_name and employees.first_name
。
我可以通过将查询更改为:
来使其工作SELECT count(*)
FROM ((flatten([stores.stores_844_1],tags))
where tags.tag_name='foo'
and employees.first_name='bar'
这个问题是我动态创建了 where 子句,所以我的 from 子句必须根据我在中的内容进行更改。虽然我可以在代码中生成一些逻辑来确定 from 子句应该是什么,但我想知道是否有办法做类似的事情:
SELECT count(*)
FROM [stores.stores_844_1]
where tags.tag_name='foo' WITHIN RECORD
and employees.first_name='bar' WITHIN RECORD
那不需要压扁主表吗? 我试过用这样丑陋的工作:
SELECT count(*)
FROM
(SELECT GROUP_CONCAT(CONCAT('>', tags.tag_name,'<')) WITHIN RECORD as f1, GROUP_CONCAT(CONCAT('>',employees.first_name,'<')) WITHIN RECORD as f2
FROM [stores.stores_844_1]
)
where f1 CONTAINS '>foo<'
and f2 CONTAINS '>bar<'
这个丑陋的解决方法符合我的要求,但它看起来真的很丑陋和丑陋而且必须有更好的方法,对吗?
答案 0 :(得分:2)
您可以使用WITHIN RECORD
提供另一个字段,指示值是否存在。我不确定这是否符合您的要求,因为您仍然需要更改FROM子句,但它似乎比您当前所做的更清晰。换句话说,试试这个:
SELECT count(*) FROM (
SELECT SUM(IF(tags.tag_name='foo', 1, 0)) WITHIN RECORD as has_foo,
SUM(IF(employees.first_name='bar', 1, 0)) WITHIN RECORD as has_bar,
FROM [stores.stores_844_1])
WHERE has_foo > 0 AND has_bar > 0