2

まず第一に、私の悪い英語をお詫びしたいと思います。複数のテーブルに問題があります。私はmySQLの世界ではまったく初心者ではありませんが、この問題の解決策を見つけることはできません。この問題では、4つのテーブルを使用します。

  1. カテゴリ
  2. 製品
  3. 仕様
  4. 仕様値

すべてのカテゴリには仕様と製品があり、すべてのspecificationvaluesには製品と仕様IDがあります。これで、ユーザーはさまざまな値で選択を行うことができます。これが私の問題です。ユーザーが値「緑」と脚「4」を選択すると、4本の脚を持つすべての緑色の製品が必要になります。そこで、JOIN(私が思うすべての種類)を使用して、適切な製品を選択しました(以下の例)

SELECT DISTINCT products.id 
FROM products 
  LEFT JOIN specificationvalues ON specificationvalues.products_id = products.id 
  LEFT JOIN specifications ON specificationvalues.specifications_id = specifications.id 
WHERE specifications.name='materiaal' 
  AND specifications.name='kleur' 
  AND specificationvalues.id='77' 
  AND specificationvalues.id='78'

問題は、すべての値が別々の行にあることです。そのため、WHEREは機能しません。MySQLエラーが発生しません。0行を返すことだけです。

誰かが私を助けてくれることを願っています!このフォーラムからたくさんの良いものを手に入れましたので、またお役に立てば幸いです。


昨日の変更が保存されなかった理由がわかりません。しかし、ここに再び私のデータがあります:

SPECIFICATIONS Table
ID   CATEGORIES_ID     NAME
38   297               Material
39   297               Measures
40   297               Color

SPECIFICATIONVALUES Table
ID   SPECIFICATIONS_ID  PRODUCTS_ID   VALUE
1    38                 988979        Masive wood 
2    39                 988979        24x57x98
3    40                 988979        Yellow
4    40                 988980        Black
5    39                 388980        24x57x98


PRODUCTS Table
ID         NAME
988979     Table
988980     Chair

だから今私は24x57x98の大きさのすべての黒い製品が欲しいです。あなたが私を助けてくれることを願っています!

4

2 に答える 2

5

名前が記述子であり、「id」または「value」が関連する必要な値である「列」を表すことをシミュレートする行を持つテーブルの多くのインスタンスを見てきました。

考慮する必要があるのは、ONEROWがどのように見えるかです。仕様名から仕様値への結合。'77'の値は、'material'の仕様、'kleur'、またはその両方にのみ対応しますか...同様に78です。次のようなさまざまな組み合わせが可能です。

where ( specifications.name = 'material' and specificationValues.id = '77' )
  OR  ( specifications.name = 'kleur' and specificationValues.id = '78' )

または、仕様値IDが仕様名に関係ない場合は、次を使用できます。

where specifications.name in ('material', 'kleur' )
  AND speciificationValues.ID in ( '77', '78' )

改訂されたサンプルデータごと... 必要なこのタイプの基準では、次のように、必要な各基準を表すために二重結合を適用します。

select p.*,
       sv1.Value as NameOfColor,
       sv2.Value as ProductMeasurement
   from
      Products p

         JOIN SpecificationValues sv1
            on p.ID = sv1.products_id
           AND sv1.Value = 'Black'
            JOIN Specifications s1
               on sv1.Specifications_ID = s1.ID
              AND s1.Name = 'Color'

         JOIN SpecificationValues sv2
            on p.ID = sv2.products_id
           AND sv2.Value = '24x57x98'
            JOIN Specifications s2
               on sv2.Specifications_ID = s2.ID
              AND s2.Name = 'Measures

ここで、複雑に見えるかもしれませんが、単純さを見てください(結合セグメント間の明示的な間隔による)。ただし、「crieria」要件をさらに追加したい場合は、同様のsv3、sv4、sv5セットを作成して複製するだけです。これを動的に構築する場合は、ユーザーがより多くのものを選択できるようになります。読み取り可能な説明(色、メジャー、マテリアル)のある種の「選択」を提供し、IDを保持するだけなので、追加の結合は必要なく、実際のIDを知っているだけで、次のように簡略化されます。 。

select p.*,
       sv1.Value as NameOfColor,
       sv2.Value as ProductMeasurement
   from
      Products p

         JOIN SpecificationValues sv1
            on p.ID = sv1.products_id
           AND sv1.Specifications_ID = 40
           AND sv1.Value = 'Black'

         JOIN SpecificationValues sv2
            on p.ID = sv2.products_id
           AND sv2.SpecificationsID = 39
           AND sv2.Value = '24x57x98'

これで、元の回答に戻ると、同じ結果を得ることができます(ただし、「24x57x98」の色、またはサンプルデータごとに「黒」の測定値がない場合。IN(コードのリスト)とIN(値のリスト)およびHAVING句を使用して、一致する要素の適切な数が検出されたことを確認します。私のFINALクエリでは、最初のテーブルとして「Products」を使用しませんが、10,000個の製品を使用できるため、2番目のテーブルを使用します。与えられたサイズ...小さなセットのテーブル/基準から始めて、名前を取得するために製品に結合します。

select
      p.id,
      p.name
   from
      specificationValues sv
         join products p
            on sv.products_id = p.id
   where
          sv.specifications_ID IN ( 39, 40 )
      AND sv.value in ( 'Black', '24x57x98' )
   group by
      p.id
   having
      count(*) = 2

あなたのspecificationValuesテーブルに(specifications_ID、value)のインデックスがあることを確認してください。このようにして、インデックスはデータを探している方法と一致することができます。(specifications_ID、value、products_id)のインデックスに3つの部分すべてを含めることを提案する人もいます。

于 2012-06-14T17:09:47.023 に答える
0

それall the values are in separate rowsは、WHERE句が常にfalseであるためではありません:

WHERE specifications.name='materiaal' AND specifications.name='kleur' 
AND specificationvalues.id='77' AND specificationvalues.id='78'

あなたは持つことができず、idは77と78に等しい。

この種のコードを使用する必要があります:

WHERE (specifications.name='materiaal' OR specifications.name='kleur')
AND (specificationvalues.id='77' OR specificationvalues.id='78')

編集:あなたのテーブルによっては、私の最後ANDもおそらくです。OR

于 2012-06-14T16:00:22.963 に答える