我需要在视图中显示类别明智的一个图像,但是下面的查询将收集所有类别图像并将每个类别项目显示为洞。
SELECT *
FROM (
(SELECT *,
IF( @prev <> category_id,
@rownum := 1,
@rownum := @rownum+1
) AS rank,
@prev := category_id,
@rownum
FROM (
SELECT * FROM products
ORDER BY category_id, rand()
) random_prodcts)
) products_ranked
WHERE rank <= 20000 AND parent_category_id = 3;
我希望修改此查询并将每个类别项目显示为一个,直到所有项目一个接一个地循环显示。
这是表结构。
Id Parent_category_id Category_id Product_position
1 3 77 00
2 3 77 00
3 3 78 00
4 3 78 00
5 3 89 00
6 3 89 00
答案 0 :(得分:0)
如果您需要按特定顺序返回的行,请在外部查询中添加BinaryFormatter
。
例如,如果要首先返回ORDER BY
为1的所有行,则为:
rank
我不明白为什么 SELECT r.*
FROM (
SELECT @rownum := IF(@prev = r.category_id, @rownum+1, 1) AS rank
, p.id
, p.parent_category_id
, @prev := p.category_id AS category_id
, p.product_position
FROM products p
CROSS
JOIN (SELECT @prev := NULL, @rownum := 0) i
ORDER
BY p.category_id
, RAND()
) r
WHERE r.parent_category_id = 3
AND r.rank <= 20000
ORDER
BY r.rank
, r.category_id
列上的等式谓词位于外部查询中,而不是内部视图查询中。如果parent_category_id
依赖于parent_category_id
(示例数据未显示与多个category_id
相关联的category_id
值的示例),那么我不知道通过减少需要实现内联视图的数量或数量,减少对parent_category_id
函数的调用次数,并减少对RAND()
函数的调用次数,查看无法重新定位的任何原因,以获得更好的性能需要排序的集合的大小。