MySQL查询 - 带有顺序/计数的更新字段,但根据另一个字段再次从1开始

时间:2016-09-12 06:16:45

标签: mysql select insert-update

我有一张产品表。此表是使用@Override public int onStartCommand(final Intent intent, int flags, int startId) { mCountDownTimer = new CountDownTimer(5000, 1000) { @Override public void onTick(long millisUnitFinished) { } @Override public void onFinish() { //you will get status every 5 second here. } }; mCountDownTimer.start(); return START_NOT_STICKY; } 查询创建的。我想添加顺序行计数或顺序(1,2,3 ..)。

但是,当产品类别或供应商发生变化时,我希望此计数重置为1。 (在查询产品类别和供应商的组合时,我最终会得到一个排序顺序)。

此问题是与较大问题相关的子问题的简化。因此,涉及php的其他解决方案并不相关。

这是一个示例表:

SELECT from X ORDER by Y

如果查询成功运行,它应该是这样的:

+--------------+------------------+-----------+-----------+
| product_name | product_category | vendor_id | sortorder |
+--------------+------------------+-----------+-----------+
| Product 1    | A                |         1 |         0 |
| Product 2    | A                |         1 |         0 |
| Product 3    | A                |         1 |         0 |
| Product 4    | B                |         1 |         0 |
| Product 5    | B                |         1 |         0 |
| Product 6    | C                |         2 |         0 |
| Product 7    | C                |         2 |         0 |
| Product 8    | C                |         2 |         0 |
| Product 9    | C                |         2 |         0 |
| Product 10   | C                |         2 |         0 |
+--------------+------------------+-----------+-----------+

我尝试了与此答案相关的不同查询的TON,主要是尝试从初始查询中获取此结果,但无济于事: Using LIMIT within GROUP BY to get N results per group?

我可以运行这样的查询来命令1,2,3,10):

+--------------+------------------+-----------+-----------+
| product_name | product_category | vendor_id | sortorder |
+--------------+------------------+-----------+-----------+
| Product 1    | A                |         1 |         1 |
| Product 2    | A                |         1 |         2 |
| Product 3    | A                |         1 |         3 |
| Product 4    | B                |         1 |         1 |
| Product 5    | B                |         1 |         2 |
| Product 6    | C                |         2 |         1 |
| Product 7    | C                |         2 |         2 |
| Product 8    | C                |         2 |         3 |
| Product 9    | C                |         2 |         1 |
| Product 10   | C                |         2 |         1 |
+--------------+------------------+-----------+-----------+

但是,这并没有达到我想要的效果,这是在' product_category'产品3和产品4之间的变化。

语法错误,这就是我想要做的事情:

SET @pos = 0;
UPDATE testtable SET sortorder = ( SELECT @pos := @pos + 1 );

一如既往地谢谢......

修改-2016年9月12日

尝试@Fancypants的解决方案。实际上,起初似乎不起作用,但它与" product_name"字段排序顺序。它将产品10放在产品5之前(1在5之前)。一旦我通过使用整数字段来解释它,结果就是完美的。

1 个答案:

答案 0 :(得分:0)

我认为您的预期结果有错误。产品9和10的排序顺序应为4和5,对吧?

以下是如何做到的:

UPDATE t
JOIN (

    SELECT
    t.*
    , @rc := IF(@prevpc != product_category OR @prevv != vendor_id, 1, @rc + 1) AS so
    , @prevpc := product_category
    , @prevv := vendor_id
    FROM
    t
    , (SELECT @prevpc := NULL, @prevv := NULL, @rc := 0) var_init_subquery
    ORDER BY product_category, vendor_id, product_name

) sq ON t.product_name = sq.product_name
SET t.sortorder = sq.so;