GVKun编程网logo

当列值更改时MySQL选择行(mysql修改某一列的值)

19

本文的目的是介绍当列值更改时MySQL选择行的详细情况,特别关注mysql修改某一列的值的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解当列值更改时MySQL选择行的

本文的目的是介绍当列值更改时MySQL选择行的详细情况,特别关注mysql修改某一列的值的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解当列值更改时MySQL选择行的机会,同时也不会遗漏关于mysql – SQL选择此选项可使值仅出现一次、mysql – SQL:选择行不在同一个表中的条件的事务、mysql – 根据日期从db中选择行、Mysql仅选择行的百分比的知识。

本文目录一览:

当列值更改时MySQL选择行(mysql修改某一列的值)

当列值更改时MySQL选择行(mysql修改某一列的值)

我需要帮助或想法如何编写它,一个mysql语句。当特定列的值更改时,我需要选择一行。此后具有相同值的行不应选择。例如,我们有一个像这样的表,用以下值填充:

ID status_1 status_2 status_3 timestamp1    0        0          0     2016-01-01 00:00:002    0        0          1     2016-01-01 01:00:003    0        1          0     2016-01-01 02:00:004    0        1          1     2016-01-01 03:00:005    1        0          0     2016-01-01 04:00:006    1        0          1     2016-01-01 05:00:007    1        1          0     2016-01-01 06:00:008    1        1          1     2016-01-01 07:00:00

如果我想在status_1更改时选择行,则查询应选择ID为1和5的行,如果我正在使用status_2的ID为:1、3、5、7的行,并且如果我使用status_3的所有ID,则为ID
。希望有人可以在过去的所有时间里为我提供帮助。

提前致谢

答案1

小编典典

MySQL user defined variables 在这种情况下会为您提供帮助。

每次看到新状态时,将1行号分配给相应的行。

并且,如果您看到的状态与上一行相同,请分配一个递增的行号。

这样,您最终可以过滤row number = 1仅包含的记录。这些特定记录实际上与其前一行相比显示出差异

SELECT *FROM ( SELECT   *,  IF(@prevStatus = YT.status_1, @rn := @rn + 1,    IF(@prevStatus := YT.status_1, @rn := 1, @rn := 1)  ) AS rn FROM your_table YT CROSS JOIN  (  SELECT @prevStatus := -1, @rn := 1 ) AS var  ORDER BY YT.ID) AS tWHERE t.rn = 1ORDER BY t.ID

mysql – SQL选择此选项可使值仅出现一次

mysql – SQL选择此选项可使值仅出现一次

对于那些一直在用这个twitter-clone帮助我的人,谢谢!在你的帮助下,我成功地完成了大部分工作,最后到了追随者功能的最后几步.

现在,我有一个包含以下字段的数据集:用户名,推文,日期

数据的示例可能如下所示:

Username    Tweet             Date
kenny       hi!               2011-10-07 19:07:00
stan        hello             2011-10-05 18:07:00
kenny       looks like rain   2011-10-05 17:07:00
stan        hello             2011-10-05 14:07:00
cartman     authoritay!       2010-10-05 14:07:00

我一直在努力研究产生数据集的sql语句,其中每个用户只出现一次最新的推文.所以,基于上面的内容,看起来像这样:

Username    Tweet             Date
kenny       hi!               2011-10-07 19:07:00
stan        hello             2011-10-05 18:07:00
cartman     authoritay!       2010-10-05 14:07:00

我一直在谷歌搜索sql搜索并尝试过COUNT,disTINCT,MAX的变种,但无济于事.任何帮助将不胜感激!谢谢!

最佳答案
select d1.username,d1.tweet,d1.date from data d1 where d1.date = 
    (select max(d2.date) from data d2 where d1.username = d2.username)

mysql – SQL:选择行不在同一个表中的条件的事务

mysql – SQL:选择行不在同一个表中的条件的事务

我有一个交易表:

Transactions
------------
id | account | type | date_time             | amount
----------------------------------------------------
 1 | 001     | 'R'  | '2012-01-01 10:01:00' | 1000
 2 | 003     | 'R'  | '2012-01-02 12:53:10' | 1500
 3 | 003     | 'A'  | '2012-01-03 13:10:01' | -1500
 4 | 002     | 'R'  | '2012-01-03 17:56:00' | 2000
 5 | 001     | 'R'  | '2012-01-04 12:30:01' | 1000
 6 | 002     | 'A'  | '2012-01-04 13:23:01' | -2000
 7 | 003     | 'R'  | '2012-01-04 15:13:10' | 3000
 8 | 003     | 'R'  | '2012-01-05 12:12:00' | 1250
 9 | 003     | 'A'  | '2012-01-06 17:24:01' | -1250

并且我希望选择所有特定类型(‘R’),但不是那些立即(按照date_time字段的顺序)为同一帐户提交的另一种类型(‘A’)的另一个交易…

因此,在前面的示例中,查询应抛出以下行:

id | account |type  | date                  | amount
----------------------------------------------------
 1 | 001     | 'R'  | '2012-01-01 10:01:00' | 1000
 5 | 001     | 'R'  | '2012-01-04 12:30:01' | 1000
 7 | 003     | 'R'  | '2012-01-04 15:13:10' | 3000

(如您所见,第2行未显示,因为第3行’取消’它…第4行’第4行被’取消’;行7确实出现(即使帐户003属于已取消的第2行),这次在第7行,它没有被任何’A’行取消;并且第8行也不会出现(它也是003帐户,因为现在这个被9取消,这也不会取消7,只是前一个一:8 ……

我在Where子句中尝试了Joins,子查询,但我真的不确定如何进行查询…

我尝试过的:

尝试加入:

   SELECT trans.type as type,trans.amount as amount,trans.date_time as dt,trans.account as acct,FROM Transactions trans
INNER JOIN ( SELECT t.type AS type,t.acct AS acct,t.date_time AS date_time
               FROM Transactions t
              WHERE t.date_time > trans.date_time
           ORDER BY t.date_time DESC
          ) AS nextTrans
       ON nextTrans.acct = trans.acct
    WHERE trans.type IN ('R')
      AND nextTrans.type NOT IN ('A')
 ORDER BY DATE(trans.date_time) ASC

这会引发错误,因为我无法将外部值引入MysqL中的JOIN.

在以下位置尝试子查询:

   SELECT trans.type as type,FROM Transactions trans
    WHERE trans.type IN ('R')
      AND trans.datetime <
          ( SELECT t.date_time AS date_time
               FROM Transactions t
              WHERE t.account = trans.account
           ORDER BY t.date_time DESC
          ) AS nextTrans
       ON nextTrans.acct = trans.acct

 ORDER BY DATE(trans.date_time) ASC

这是错误的,我可以将外部值引入MysqL中的WHERE,但我无法找到正确过滤我需要的方法…

重要编辑:

我设法实现了解决方案,但现在需要认真优化.这里是:

SELECT *
  FROM (SELECT t1.*,tFlagged.id AS cancId,tFlagged.type AS cancFlag
          FROM transactions t1
     LEFT JOIN (SELECT t2.*
                  FROM transactions t2
              ORDER BY t2.date_time ASC ) tFlagged
            ON (t1.account=tFlagged.account
                  AND
                t1.date_time < tFlagged.date_time)
         WHERE t1.type = 'R'
      GROUP BY t1.id) tCanc
 WHERE tCanc.cancFlag IS NULL
    OR tCanc.cancFlag <> 'A'

我自己加入了这个表,只考虑了相同的帐户和很棒的date_time. Join按date_time排序.按ID分组我设法只获得了连接的第一个结果,这恰好是同一帐户的下一个事务.

然后在外部选择上,我过滤掉那些具有“A”的东西,因为这意味着下一个交易实际上是对它的取消.换句话说,如果同一个帐户没有下一个交易,或者下一个交易是’R’,那么它不会被取消,并且必须在结果中显示…

我懂了:

+----+---------+------+---------------------+--------+--------+----------+
| id | account | type | date_time           | amount | cancId | cancFlag |
+----+---------+------+---------------------+--------+--------+----------+
|  1 | 001     |   R  | 2012-01-01 10:01:00 |   1000 |      5 | R        |
|  5 | 001     |   R  | 2012-01-04 12:30:01 |   1000 |   NULL | NULL     |
|  7 | 003     |   R  | 2012-01-04 15:13:10 |   3000 |      8 | R        |
+----+---------+------+---------------------+--------+--------+----------+

它将每个交易与下一个交易关联到同一个帐户,然后筛选出已取消的交易…成功!!

正如我所说,现在的问题是优化.我的真实数据有很多行(因为预计会有时间跨越事务的表),而对于现在约有10,000行的表,我在1分44秒内得到了一个积极的结果.我想这就是加入的东西……(对于那些在这里知道协议的人,我该怎么做?在这里发一个新问题并将其作为解决方案发布到这个?或者只是在这里等待更多答案?)

最佳答案
这是一个基于嵌套子查询的解决方案.首先,我添加了几行来捕获更多案例.例如,交易10不应该取消交易10,因为交易11介于两者之间.

> select * from transactions order by date_time;
+----+---------+------+---------------------+--------+
| id | account | type | date_time           | amount |
+----+---------+------+---------------------+--------+
|  1 |       1 | R    | 2012-01-01 10:01:00 |   1000 |
|  2 |       3 | R    | 2012-01-02 12:53:10 |   1500 |
|  3 |       3 | A    | 2012-01-03 13:10:01 |  -1500 |
|  4 |       2 | R    | 2012-01-03 17:56:00 |   2000 |
|  5 |       1 | R    | 2012-01-04 12:30:01 |   1000 |
|  6 |       2 | A    | 2012-01-04 13:23:01 |  -2000 |
|  7 |       3 | R    | 2012-01-04 15:13:10 |   3000 |
|  8 |       3 | R    | 2012-01-05 12:12:00 |   1250 |
|  9 |       3 | A    | 2012-01-06 17:24:01 |  -1250 |
| 10 |       3 | R    | 2012-01-07 00:00:00 |   1250 |
| 11 |       3 | R    | 2012-01-07 05:00:00 |   4000 |
| 12 |       3 | A    | 2012-01-08 00:00:00 |  -1250 |
| 14 |       2 | R    | 2012-01-09 00:00:00 |   2000 |
| 13 |       3 | A    | 2012-01-10 00:00:00 |  -1500 |
| 15 |       2 | A    | 2012-01-11 04:00:00 |  -2000 |
| 16 |       2 | R    | 2012-01-12 00:00:00 |   5000 |
+----+---------+------+---------------------+--------+
16 rows in set (0.00 sec)

首先,创建一个查询,为每个事务“获取同一帐户中该事务之前的最近事务的日期”:

SELECT t2.*,MAX(t1.date_time) AS prev_date
FROM transactions t1
JOIN transactions t2
ON (t1.account = t2.account
   AND t2.date_time > t1.date_time)
GROUP BY t2.account,t2.date_time
ORDER BY t2.date_time;

+----+---------+------+---------------------+--------+---------------------+
| id | account | type | date_time           | amount | prev_date           |
+----+---------+------+---------------------+--------+---------------------+
|  3 |       3 | A    | 2012-01-03 13:10:01 |  -1500 | 2012-01-02 12:53:10 |
|  5 |       1 | R    | 2012-01-04 12:30:01 |   1000 | 2012-01-01 10:01:00 |
|  6 |       2 | A    | 2012-01-04 13:23:01 |  -2000 | 2012-01-03 17:56:00 |
|  7 |       3 | R    | 2012-01-04 15:13:10 |   3000 | 2012-01-03 13:10:01 |
|  8 |       3 | R    | 2012-01-05 12:12:00 |   1250 | 2012-01-04 15:13:10 |
|  9 |       3 | A    | 2012-01-06 17:24:01 |  -1250 | 2012-01-05 12:12:00 |
| 10 |       3 | R    | 2012-01-07 00:00:00 |   1250 | 2012-01-06 17:24:01 |
| 11 |       3 | R    | 2012-01-07 05:00:00 |   4000 | 2012-01-07 00:00:00 |
| 12 |       3 | A    | 2012-01-08 00:00:00 |  -1250 | 2012-01-07 05:00:00 |
| 14 |       2 | R    | 2012-01-09 00:00:00 |   2000 | 2012-01-04 13:23:01 |
| 13 |       3 | A    | 2012-01-10 00:00:00 |  -1500 | 2012-01-08 00:00:00 |
| 15 |       2 | A    | 2012-01-11 04:00:00 |  -2000 | 2012-01-09 00:00:00 |
| 16 |       2 | R    | 2012-01-12 00:00:00 |   5000 | 2012-01-11 04:00:00 |
+----+---------+------+---------------------+--------+---------------------+
13 rows in set (0.00 sec)

将其用作子查询以使每个事务及其前任在同一行上.使用一些过滤来抽出我们感兴趣的交易 – 即’A’交易,其前身是’R’交易,它们完全取消 –

SELECT
  t3.*,transactions.*
FROM
  transactions
  JOIN
  (SELECT t2.*,MAX(t1.date_time) AS prev_date
   FROM transactions t1
   JOIN transactions t2
   ON (t1.account = t2.account
      AND t2.date_time > t1.date_time)
   GROUP BY t2.account,t2.date_time) t3
  ON t3.account = transactions.account
     AND t3.prev_date = transactions.date_time
     AND t3.type='A'
     AND transactions.type='R'
     AND t3.amount + transactions.amount = 0
  ORDER BY t3.date_time;


+----+---------+------+---------------------+--------+---------------------+----+---------+------+---------------------+--------+
| id | account | type | date_time           | amount | prev_date           | id | account | type | date_time           | amount |
+----+---------+------+---------------------+--------+---------------------+----+---------+------+---------------------+--------+
|  3 |       3 | A    | 2012-01-03 13:10:01 |  -1500 | 2012-01-02 12:53:10 |  2 |       3 | R    | 2012-01-02 12:53:10 |   1500 |
|  6 |       2 | A    | 2012-01-04 13:23:01 |  -2000 | 2012-01-03 17:56:00 |  4 |       2 | R    | 2012-01-03 17:56:00 |   2000 |
|  9 |       3 | A    | 2012-01-06 17:24:01 |  -1250 | 2012-01-05 12:12:00 |  8 |       3 | R    | 2012-01-05 12:12:00 |   1250 |
| 15 |       2 | A    | 2012-01-11 04:00:00 |  -2000 | 2012-01-09 00:00:00 | 14 |       2 | R    | 2012-01-09 00:00:00 |   2000 |
+----+---------+------+---------------------+--------+---------------------+----+---------+------+---------------------+--------+
4 rows in set (0.00 sec)

从上面的结果可以看出我们几乎就在那里 – 我们已经确定了不需要的交易.使用LEFT JOIN,我们可以从整个事务集中筛选出这些:

SELECT
  transactions.*
FROM
  transactions
LEFT JOIN
  (SELECT
     transactions.id
   FROM
     transactions
     JOIN
     (SELECT t2.*,MAX(t1.date_time) AS prev_date
      FROM transactions t1
      JOIN transactions t2
      ON (t1.account = t2.account
         AND t2.date_time > t1.date_time)
      GROUP BY t2.account,t2.date_time) t3
     ON t3.account = transactions.account
        AND t3.prev_date = transactions.date_time
        AND t3.type='A'
        AND transactions.type='R'
        AND t3.amount + transactions.amount = 0) t4
  USING(id)
  WHERE t4.id IS NULL
    AND transactions.type = 'R'
  ORDER BY transactions.date_time;

+----+---------+------+---------------------+--------+
| id | account | type | date_time           | amount |
+----+---------+------+---------------------+--------+
|  1 |       1 | R    | 2012-01-01 10:01:00 |   1000 |
|  5 |       1 | R    | 2012-01-04 12:30:01 |   1000 |
|  7 |       3 | R    | 2012-01-04 15:13:10 |   3000 |
| 10 |       3 | R    | 2012-01-07 00:00:00 |   1250 |
| 11 |       3 | R    | 2012-01-07 05:00:00 |   4000 |
| 16 |       2 | R    | 2012-01-12 00:00:00 |   5000 |
+----+---------+------+---------------------+--------+

mysql – 根据日期从db中选择行

mysql – 根据日期从db中选择行

我在mysql表中有一个行列表

+--------+-----+------------+------------+------------+-----------+
| off_id | uid | leave_from | leave_to   | leave_code | reason    |
+--------+-----+------------+------------+------------+-----------+
|      1 |   1 | 2012-01-01 | 2012-01-05 | OFF        | asdsda    |
|      2 |   1 | 2012-01-15 | 2012-01-16 | OFF        | asdd      |
|      5 |   1 | 2012-02-03 | 2012-02-05 | OFF        | gfjghjhgj |
+--------+-----+------------+------------+------------+-----------+

我必须选择日期2012-01-01到2012-01-05之间的行.
我该怎么办呢,请帮忙.

解决方法:

SELECT Off_Id,uid,Leave_from,leave_to,leave_code
FROM YourTableName
WHERE Leave_From>="2012-01-01" and Leave_to <="2012-01-05"

Mysql仅选择行的百分比

Mysql仅选择行的百分比

我想使用第二列(art_count)仅显示那些包含总art_count的X%的行。

我的资料:

title   art_counta       3b       12c       9d       4e       45

到目前为止我的查询:

SELECT title, COUNT(art) AS art_countFROM table1GROUP BY art HAVING ... ?

使用SUM进行了尝试,但未成功。

答案1

小编典典
SELECT title, COUNT(art) AS art_countFROM table1GROUP BY art HAVING art_count >= (select count(*) * X / 100 from table1)

您需要为插入一个值 X

关于当列值更改时MySQL选择行mysql修改某一列的值的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于mysql – SQL选择此选项可使值仅出现一次、mysql – SQL:选择行不在同一个表中的条件的事务、mysql – 根据日期从db中选择行、Mysql仅选择行的百分比的相关知识,请在本站寻找。

本文标签: