2012-04-14 48 views
0

私の最初の投稿はここにあります。別のテーブルの値から値をソートする

私のproducts_categoriesテーブル内の値を使用して、my productsテーブルから表示された値をソートしようとしています。

私の製品テーブルには、次のフィールドが含まれています

id | psku | pname | pdescription 

マイproducts_categoriesテーブルには、次のフィールドがあります。私が構築しています

id | psku | subcategory | orderid 

サイトでは、いくつかのサブカテゴリーが含まれている小さなEショップ、です。この時点でのセットアップでは、1つの製品を複数のカテゴリに追加することができます。

たとえば、商品sku#6001は、化粧品&の2つのサブカテゴリに表示されます。私は現在、各サブカテゴリにデータを表示するには、次のクエリを使用しています

id | psku | subcategory | orderid 
1 | 6001 | cosmetics | 1 
2 | 6004 | eyelashes | 1 
3 | 6003 | cosmetics | 2 
4 | 6011 | cosmetics | 3 
5 | 6020 | eyelashes | 2 
6 | 6045 | cosmetics | 4 

SELECT * FROM products LEFT JOIN products_subcategories 
ON products.psku = products_subcategories.psku 
WHERE products.psku IN ('6001','6003','6011','6020','6045') 
GROUP BY e2o_products_subcategories.psku 
ORDER BY e2o_products_subcategories.orderid ASC 

これは、ように私の結果を表示する必要があります。

私はそうのような私products_subcategoriesテーブルで、その後2つのエントリを持っているでしょう
Cosmetics: 
PSKU 6001 
PSKU 6003 
PSKU 6011 
PSKU 6045 

eyelashes: 
PSKU 6004 
PSKU 6020 

動作していないようです。最悪の結果で他の組み合わせを試してみました。製品は表示されますが、オーダーIDで並べ替えません

誰かがこの問題を解決できる可能性がありますか。必要に応じてサンプルデータを提供することができます。

ありがとうございます。あなたが最初のサブカテゴリ名に注文する必要があり

+0

サイドノート:パフォーマンスを向上させるには、bエターの正規化。あなたの健全性のためにも。 'products.id'を' products.product_id'に、 'products_categories.id'を' products_categories 'に変更してください。product_category_id'、および 'product_categories.pksu'を' product_categories.product_id'に変更します。その後、pksuではなくproduct_idに参加してください。 –

+0

order byとgroup by句の 'e2o_'プレフィックスは何ですか? – kjones

+0

こんにちは、ごめんなさい。これは古いコードから残っていたものです。削除するのを忘れました。説明ありがとう。このようにするのが理にかなっています。理解することをお勧めします。 – daespo

答えて

1

あなたが作成したsampledata.phpファイルを見てきました。私はあなたがしようとしていることを理解するために苦労しています。なぜ2つのクエリを実行していますか?確かに、単一のクエリで同じ結果を得ることができます。

あなたはその後、2番目のクエリに渡しているpskusのリストを返しますあなたの最初のクエリ -

SELECT psku, subcategory 
FROM products_subcategories 
WHERE subcategory = 'cosmetics' 

+------+-------------+ 
| psku | subcategory | 
+------+-------------+ 
| 6018 | cosmetics | 
| 6017 | cosmetics | 
| 6022 | cosmetics | 
| 6025 | cosmetics | 
+------+-------------+ 

2番目のクエリは、ある -

SELECT DISTINCT products.* 
FROM e2o_products 
INNER JOIN e2o_products_subcategories 
    ON e2o_products.psku = e2o_products_subcategories.psku 
WHERE e2o_products.pstatus = '1' 
AND e2o_products.psku IN (6018,6017,6022,6025) 
GROUP BY e2o_products.psku 
ORDER BY e2o_products_subcategories.dsporder DESC 

あなたが唯一取得していることを考えるとあなたが行うことができる製品テーブルのフィールド -

SELECT p.* 
FROM products p 
INNER JOIN products_subcategories ps 
    ON p.psku = ps.psku 
WHERE p.pstatus = 1 
AND ps.subcategory = '$subcat' 
ORDER BY ps.dsporder DESC 
+0

美しい!まさに私が望んでいたもの。クエリを短くしてきれいにしてくれてありがとう。素晴らしいソリューション、非常に速い応答。他の関係者にも感謝します。 乾杯! – daespo

1

は、そう

SELECT * FROM products 
    LEFT JOIN products_subcategories 
    ON products.psku = products_subcategories.psku 
WHERE products.psku IN ('6001','6003','6011','6020','6045') 
ORDER BY e2o_products_subcategories.subcategory ASC, 
     e2o_products_subcategories.orderid ASC 

注私はまた、あなたが唯一の各PSKUが結果に一度返されます、それと同じように、あなたのGROUP BYを削除した、あなたはしませんPSKUの複数のカテゴリにどのサブカテゴリが返されるかを自信を持って予測することができます。すべての製品にサブカテゴリ表にエントリがある場合は、LEFT JOINをINNER JOINに変更することをお勧めします。

+0

@daespo製品に何も表示されないのはなぜですか?あなたは例を投稿できますか?それは正しいとは言えません。それはそれが属するカテゴリとして何度も表示されるはずです。 – liquorvicar

+0

こんにちは。私はいくつかのサンプルデータを投稿すれば助けになるでしょうか? テストサイトはhttp://e2o.aiiic.com です。サブカテゴリを見ると、私が達成しようとしているものが見えます。 – daespo

+0

@daespoはい、間違いなくサンプルデータを投稿してください。 – liquorvicar

関連する問題