1

我正在尝试从具有类别 ID(1、5、12)的类别中选择 DISTINCT 产品,由 MySQL 数据库中的 cat_order + prod_order 排序

问题:

如果在多个类别中找到产品,我需要显示第一个结果,

即:产品编号 1 分配给类别 1 和 5,我需要显示类别 1 中的产品编号 1 及其 prod_order 并跳过类别 5 中的列表,

  • 基本上我需要显示类别 1 中的所有产品,而不是移动到类别 5 并显示那里的所有产品,其中产品 id 以前未显示,然后移动到列表中的另一个类别 (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
    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

每个产品可以属于任意数量的类别,例如产品 id 1 属于上例中的类别 id 1 和 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 回答