1

MySQLデータベースからcat_order+prod_orderで注文されたカテゴリID(1、5、12)のカテゴリ内からDISTINCT製品を選択しようとしています

問題:

製品が複数のカテゴリで見つかった場合、最初の結果を表示する必要があります。

つまり、製品番号1はカテゴリ1と5に割り当てられています。カテゴリ1の製品番号1をそのprod_orderと一緒に表示し、カテゴリ5のリストをスキップする必要があります。

  • 基本的に、カテゴリ1のすべての製品を表示する必要があります。カテゴリ5に移動して、以前は製品IDが表示されていなかったカテゴリ5からすべての製品を表示し、リスト内の別のカテゴリに移動します(12)

私が次のようなものを実行した場合:

SELECT
    prod_to_cat.prod_id AS prod_to_cat_prod_id,
    prod_to_cat.prod_order AS prod_to_cat_prod_order,
    prod_to_cat.cat_id AS prod_to_cat_cat_id,
    prod_to_cat.cat_order AS prod_to_cat_cat_order,
    products.id,
    products.name

FROM
    prod_to_cat, products

WHERE
    prod_to_cat.prod_id = products.id
AND prod_to_cat.cat_id IN (1, 5, 12)
GROUP BY 
    prod_to_cat.prod_id
ORDER BY
    prod_to_cat_cat_order ASC,
    prod_to_cat_prod_order DESC

一貫性のない結果が得られます(製品1はリストの最初のカテゴリから選択されません)。そのため、「GROUP BY prod_id」なしで選択し、prod_idでグループ化するよりも別のselectでラップすることにしました。

そのようです:

SELECT
    prod_to_cat_prod_id,
    prod_to_cat_prod_order,
    prod_to_cat_cat_id,
    name
FROM
    (
        SELECT
            prod_to_cat.prod_id AS prod_to_cat_prod_id,
            prod_to_cat.prod_order AS prod_to_cat_prod_order,
            prod_to_cat.cat_id AS prod_to_cat_cat_id,
            prod_to_cat.cat_order AS prod_to_cat_cat_order,
            products.id,
            products.name
        FROM
            prod_to_cat, products
        WHERE
            prod_to_cat.prod_id = products.id
        AND prod_to_cat.cat_id IN (1, 5, 12)
        ORDER BY 
            prod_to_cat_cat_order ASC,
            prod_to_cat_prod_order DESC
    ) AS prod
GROUP BY
    prod_to_cat_prod_id
ORDER BY
    prod_to_cat_cat_order ASC,
    prod_to_cat_prod_order DESC
LIMIT 0, 10;

私がやろうとしていること:

私はこれを行うためのより効率的な方法を見つけようとしています。

テーブル構造:

prod_to_cat:

prod_id | cat_id | cat_order | prod_order   |
    1        1          1           2
    2        1          1           0
    3        1          1           0
    1        5          2           4
    4        5          2           0


products:


id  |   name |  descr   |   price   |
 1    name_1
 2    name_2
 3    name_3
 4    name_4

各製品は任意の数のカテゴリに含めることができます。たとえば、上記の例では、製品ID1はカテゴリID1および5に含まれています。

返信ありがとうございます。パシャ

4

1 に答える 1

3

グループごとの最小値が必要です:

SELECT   prod_to_cat.*,
         products.name
FROM     prod_to_cat NATURAL JOIN (
           SELECT   prod_id,
                    MIN(cat_id) AS cat_id
           FROM     prod_to_cat
           WHERE    cat_id IN (1, 5, 12)
           GROUP BY prod_id
         ) t
    JOIN products ON t.prod_id = products.id
ORDER BY prod_to_cat.cat_order  ASC,
         prod_to_cat.prod_order DESC

sqlfiddleでそれを参照してください。

于 2012-09-14T17:33:55.977 に答える