2

店舗に関する情報を含むレコードがいくつかあります。これらのレコードには、いくつかの異なるネストされたフィールドがあります。ネストされたフィールドの 1 つはタグで、もう 1 つは従業員です。タグと特定の名前の従業員を持つ店舗の数を取得しようとしています。だから私はこれをしました:

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句はwhereの内容に応じて変更する必要があることです。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<'

この醜い回避策は私が望むように機能しますが、本当にハックで醜いように見え、もっと良い方法があるはずですよね?

4

1 に答える 1

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
于 2013-01-07T21:30:14.550 に答える