グループ連結限度1

私のグループconcatクエリはここにあります

GROUP_CONCAT(DISTINCT IF(catalog_product_entity_varchar.attribute_id = '134',catalog_product_entity_varchar.value,NULL)) AS 'Subtitle'

この表には、属性IDとして134の複数の行が含まれています。本当に私がしたいのは、最初のcatalog_product_entity_varchar.valueを引っ張ることです。catalog_product_entity_int.attribute_id = 134

完全なSQLは次のとおりです

SELECT catalog_product_entity.sku AS SKU,
    IF(catalog_product_entity_decimal.attribute_id = '67',catalog_product_entity_decimal.value,NULL) AS 'Price',
    GROUP_CONCAT(DISTINCT IF(catalog_product_entity_int.attribute_id = '146',catalog_product_entity_int.value,NULL)) AS 'Brand',
    GROUP_CONCAT(DISTINCT IF(catalog_product_entity_varchar.attribute_id = '63',catalog_product_entity_varchar.value,NULL)) AS 'Name',
    GROUP_CONCAT(DISTINCT IF(catalog_product_entity_varchar.attribute_id = '134',catalog_product_entity_varchar.value,NULL)) AS 'Subtitle'
FROM catalog_product_entity
    JOIN catalog_product_entity_decimal ON catalog_product_entity_decimal.entity_id = catalog_product_entity.entity_id
    JOIN catalog_product_entity_int ON catalog_product_entity_int.entity_id = catalog_product_entity.entity_id
    JOIN catalog_product_entity_varchar ON catalog_product_entity_varchar.entity_id = catalog_product_entity.entity_id          
WHERE catalog_product_entity.type_id='simple' AND catalog_product_entity.sku='30020262'
GROUP by catalog_product_entity.entity_id

編集:物事をより明確にするための試み

私は製品のデータを引き出しています。簡単にするには、ほとんどのクエリを無視してみてください。私たちは 'sku'と 'subtitle'だけに集中します。

最初のテーブルcatalog_product_entity。各製品のSKUを引き出しています。固有の 'entity_id'もあります。

この製品の関連するすべての詳細をcatalog_product_entity_varcharという別のテーブルから取り除きたい場合は、 'entity_id'を使用します。

属性IDは、あなたが必要とする特定の情報を参照します。 134は字幕、63は名前です。それぞれにIDを持つ他の '属性'もあります。

私はIF文を使って134を 'subtitle'に、63を 'name'に割り当てました。テーブルはこのように見えます。

entity_id   attribute_id   store_id   value
1                134         0        green, large
1                134         1        green, large
1                134         2        green, large
1                63          0        dakine day hiker bag
1                63          1        dakine day hiker bag
1                63          2        dakine day hiker bag

どの製品が同じサブタイトルを3回記憶しているように見えるかに注目してください。これは、私が使用している電子商取引プラットフォーム(Magento)では、実行している各店舗ごとに異なるサブタイトルを保存できるためです(Magentoインストールでは、複数のドメインで同じ製品データベースを共有できますが、

私はGroup_Concatを使ってデータを取得した後、DISTINCTを使って1つのサブタイトルしか取得していないことを確認しています。しかし私が直面している問題は、ほとんどの場合、私のサブタイトルと名前はすべての店舗(全く異なる作品)で全く同じですが、別々のサブタイトルがあるときは複数のサブタイトルを取得します。

正直言って私はMYSQLにうまくやっていませんし、どうやらgroup_concatを完全に省略しているかもしれないと思っています。製品が使用する店舗IDはいつもわからないことに注意してください。

私はどの字幕をつかまえても気にしません、私はちょうど1つ、最初のもの、最小のもの、最大のものを求めています。なんでも。

1
PK/FKの制約を含め、それを理解するために示された4つのテーブルのスキーマを少なくとも十分に与える必要があります。内側の結合を使用すると、各 catalog_product_entity は各サブタイプに行を持たなければなりません。 OUTER JOINは必要ないと確信していますか?しかし、とにかく、あなたが望むことを望むなら、あなたはただ2つのテーブルを結合するだけです。あなたは 'first'を定義しなければなりません。
追加された 著者 Jonathan Leffler,
エンティティID列は正しいですか?最後の3行は最初の3行とは異なるエンティティIDを持つべきですか? 6行すべてが異なるエンティティIDを持つべきですか?
追加された 著者 Jonathan Leffler,
OK;私は森を見始めています...特定のエンティティIDがすべての店舗で表されていることが保証されていないので、店舗2,3にエンティティID12345があり、店舗にはエンティティID1が表示されます0、1、2なので、物事を単純化するために店舗番号を選ぶことはできませんか?あなたは、運営店舗がすべての品物を運んでいなくても、すべての主体が店舗0に入っていなければならないことを義務づけることができますか?たぶんそれは問題ではない...
追加された 著者 Jonathan Leffler,
catalog_product_entity テーブルに sku entity_id という列があり、 entity_id という列が一意であることが推測できます。 entity_id attribute_id store_id value という列の catalog_product_entity_varchar 最初の3つの列の組み合わせは一意です。しかし、あなたは entity_id attribute_id value だけに興味があります。値の生成に store_id が使用されているかどうかは気にしません。あれは正しいですか?
追加された 著者 Jonathan Leffler,
それは生のSQLでなければならないのですか?これに対してMagentoのPHPクラスを使用できませんか?
追加された 著者 clockworkgeek,
ところで、Magentoが店舗0の属性を作成しないケースはわかりません。それをフィルタリングすれば、うまくいくはずです。
追加された 著者 clockworkgeek,
それは正しいです、それは1つの製品です。 2つの属性(字幕、名前)。また、この製品では3つの店舗があり(この例では)、各店舗には1つの製品の名前とサブタイトルが異なる場合があります(この例では、この製品のすべての店舗で名前とサブタイトルが同じです)
追加された 著者 Lucas Scholten,
@ジョナサン・リーフラーあなたが言ったことはすべて正しいです。しかし、データベースを掘り下げた後は、すべての属性と同じように見えますが、entity_id は常に店舗0の値を持っています。私は間違いを犯し、そうでなければ信じるように導きます。私にダブルチェックをさせるためのclockworkgeekに感謝します。
追加された 著者 Lucas Scholten,

1 答え

あなたは言う:

表には属性IDとして146の複数の行が含まれています。本当に私がしたいのは、catalog_product_entity_int.attribute_id = 146という最初のcatalog_product_entity_int.valueを引っ張ることです。

あなたが欲しいと言うことは、次のように実装されます:

SELECT Value
  FROM Catalog_Product_Entity_Int
 WHERE Attribute_ID = 146;

これは複数の値を返すかもしれないので、あなたが '最初のもの'を意味するものを定義しなければなりません。それは、MIN、MAX、LIMIT 1、または他の何らかの基準であってもよい。

SELECT MIN(Value) AS Value
  FROM Catalog_Product_Entity_Int
 WHERE Attribute_ID = 146;

SELECT MAX(Value) AS Value
  FROM Catalog_Product_Entity_Int
 WHERE Attribute_ID = 146;

SELECT Value
  FROM Catalog_Product_Entity_Int
 WHERE Attribute_ID = 146
 LIMIT 1;

あなたが望むことを言えば、私は他の3つのテーブルに参加したり、GROUP_CONCATを使用する必要はありません。

それは、あなたが本当に望んでいることを私たちに語っていないことが疑わしく思えます。なぜなら、示されたクエリは、明記された要件に対して劇的な過剰なものであるからです。

1
追加された
私はいくつかの情報を元の投稿を編集し、うまくいけば、これは役立ちます。
追加された 著者 Lucas Scholten,