1

これは、データベースからデータを取得するために使用するクエリです

SELECT
    product_description.name as name, 
    product.image as iurl
FROM
    product_description, product
WHERE
    product_description.product_id = product.product_id
    AND product.product_id
    AND product.product_id = '33';
  1. このクエリが二重の結果を生成するのはなぜですか?

  2. パーツを手動で追加するのではなく、データベースに保存されている複数の値 (id) で自動的に検索したいAND product.product_id='?'。値はシリアル化された形式で保存されます。

何かのようなもの

... AND product.product_id in (setting.value WHERE key='featured');

クエリが正しくないことはわかっています。必要なものを表示しようとしているだけです。

テーブルセッティング':

value    | key
-------------------
23,43,28 | featured
4

2 に答える 2

1

解決

productsテーブルに格納されているすべての詳細settings(カンマ区切り)を取得するには、 FIND_IN_SET()を使用できます。

SELECT
    product_description.description, 
    product.name,
    product.id
FROM
    product_description, product
WHERE
    product_description.id = product.id
    AND FIND_IN_SET(product.id, ( SELECT value FROM setting where `key` = 'featured' ) );

SQLフィドル

注:重複したエントリが表示される理由は、特定の製品に複数の説明オプションがあるためである可能性があります。GROUP_CONCAT を使用してこれを処理できます 次のように動作するはずです。

エピローグ

あなたのデータベースの設計は良くありません.次のようになるはずです.

product             -- All my products go here
product_details     -- Details of all the products ( A product could have multiple details)
categories          -- eg: Featured, Seasonal
product_categories  -- association of product to categories
于 2013-04-14T16:19:22.380 に答える
1

これは何らかの形でリレーショナル パラダイムを破っています。値が 23、43、および 28 の 3 つのエントリが必要です。

次に、フィールドが varchar であると推測valueしています (「値」と「キー」が mysql の予約語であることをご存知ですか?) したがって、文字列内を調べて、フィールド内のパターン「,23,」を見つけることができます。何かのようなもの :WHERE CONCAT(',', field_value, ',') LIKE "%,23,%"

于 2013-04-14T15:05:13.907 に答える