MySQL SELECT,JOIN,GROUP BY查询优化

时间:2012-09-14 17:25:25

标签: mysql

我正在尝试从类别ID(1,5,12)的类别中选择DISTINCT产品,通过MySQL数据库中的cat_order + prod_order进行ORDERED

问题:

如果找到的产品超过1个类别,我需要显示第一个结果,

即:产品编号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中。

非常感谢任何回复。 帕沙

1 个答案:

答案 0 :(得分:3)

你想要groupwise minimum

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上查看。