MySQL - 按category_id排序尽量避免重复彼此接近

Bal*_*ath 21 mysql sql-order-by

请忍受我的英语.

我有一张这样的桌子,

 id |  category_id  |  product_id
 -----------------------------------
  1 |  1            |  1
  2 |  1            |  2
  3 |  2            |  1
  4 |  2            |  3
  5 |  1            |  4
  6 |  3            |  5
Run Code Online (Sandbox Code Playgroud)

我想要输出,

id  |  category_id  |  product_id
----------------------------------
1   |  1            |  1
3   |  2            |  1
6   |  3            |  5
2   |  1            |  2
4   |  2            |  3
5   |  1            |  4
Run Code Online (Sandbox Code Playgroud)

所以简而言之,我需要的是,category_id必须按顺序排列,以便像1, 2, 3, 1, 2, 3,......等循环重复.

bla*_*hop 19

这是一个查询,为您提供结果:

SELECT p1.*
FROM `product` p1
JOIN `product` p2
      ON p2.category_id = p1.category_id 
      AND p2.id <= p1.id
GROUP BY p1.id
ORDER BY COUNT(*),category_id;
Run Code Online (Sandbox Code Playgroud)

product你的桌子在哪里

这里的DEMO


Ram*_*ith 5

...尽量避免重复彼此接近

哦,那好吧.我能提出的最简单的解决方案是GROUP BY 'product_id' ORDER BY 'category_id'.这会使你的表看起来像这样:

id  |  category_id  |  product_id
----------------------------------
1   |  1            |  1
3   |  2            |  1
2   |  1            |  2
4   |  2            |  3
5   |  1            |  4
6   |  3            |  5
Run Code Online (Sandbox Code Playgroud)

我假设"category_id必须被排序,以便它在循环中重复"是"我不希望彼此重复"的翻译.

如果您在产品1和产品2上有三个类别,它们将组合在一起(1,1,1,2,2,2)但类别将按数字顺序排列(1,2,3,1,2,3) .它不是您想要的完美解决方案,但它是一个简单的解决方案,似乎您可以满足您的需求.

查询中任何复杂的hackery都只会降低查询速度.虽然它现在可能不是问题,但如果你有很多记录,这可能是一个大问题.