我在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
但是我想知道,是否有更有效的方法,因为这些语句主要是副本。
答案 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个条目(无特定顺序)。