一条语句中有多个相似的SELECT

时间:2019-07-16 10:41:16

标签: mysql sql select union

我在SQL中有以下SELECT语句: 这个:

SELECT
    *
FROM
    products
WHERE
    product_category = '12'
LIMIT
    3

这:

SELECT
    *
FROM
    products
WHERE
    product_category = '36'
LIMIT
    3

这:

SELECT
    *
FROM
    products
WHERE
    product_id IN ('3178','3181','7403')
LIMIT
    3

如您所见,它们非常相似,我要有效地运行这3条语句,其要点是整个结果应长9行(因为3x3),首先应显示类别12的三种产品,则应显示类别36中的后三个产品,而后三个产品应是ID为3178,3181,7403的产品。

我知道,我可以像这样使用UNION

    (SELECT
        *
    FROM
        products
    WHERE
        product_category = '12'
    LIMIT
        3)
UNION
    (SELECT
        *
    FROM
        products
    WHERE
        product_category = '36'
    LIMIT
        3)
UNION
    (SELECT
        *
    FROM
        products
    WHERE
        product_id IN ('3178','3181','7403')
    LIMIT
        3)
LIMIT 9

但是我想知道,是否有更有效的方法,因为这些语句主要是副本。

4 个答案:

答案 0 :(得分:0)

在MySQL 8+中,您可以使用窗口函数:

const isProcessing = !Boolean(isProcessingUntil);

答案 1 :(得分:0)

对于mysql 8.0或更高版本,您可以减少一个子查询

select col1,col2,col3 from (SELECT *, row_number() over(partition by product_category  order by product_category) rn
    FROM
        products
    WHERE
        product_category in( 12,36) 
) a where a.rn<=3


union 
  SELECT
        col1,col2,col3
    FROM
        products
    WHERE
        product_id IN ('3178','3181','7403') order by product_id
    LIMIT
        3 

答案 2 :(得分:0)

UNION ALL

仅UNIION会尝试将类似的记录合并为一个。使用UNION ALL,将显示所有内容。

答案 3 :(得分:-1)

也许,如果您真的想提高效率,就必须以一种稍微不同的方式看待它,而不是局限于查询,而要考虑更新数据库结构。

例如,您可以在products表中添加新列以处理组顺序。

| product_id | product_category | product_group |
|------------|------------------|---------------|
| 3178       |                  | c             |
|            | 12               | a             |
|            | 36               | b             |
| 3181       |                  | c             |
| 7403       |                  | c             |

并通过简单的查询获取结果:

SELECT * from products
WHERE product_group in (a, b, c)
ORDER BY product_group

取决于为什么将每个组限制为仅3个结果,无论如何,使用代码来管理要返回的条目可能更有意义(因此,可以使用一些代码来设置product_group字段),而不仅仅是表中的前3个条目(无特定顺序)。