【问题标题】:MySQL select column which is a value in another columnMySQL选择列,这是另一列中的值
【发布时间】:2014-01-08 00:18:28
【问题描述】:

我的sql表是这样的:

+----+------------+--------+---------------+---------------+-------------+----------+-------------+---------------------+
| id | msisdn     | status | reason        | CallRejection | Unavailable | NoAnswer | NetworkBusy | autotimestamp       |
+----+------------+--------+---------------+---------------+-------------+----------+-------------+---------------------+
|  1 | 9999999901 | Failed | NoAnswer      |             1 |           2 |        2 |           4 | 2013-12-19 15:46:50 |
|  2 | 9999999902 | Failed | NetworkBusy   |             4 |           2 |        3 |           2 | 2013-12-19 13:07:42 |
|  3 | 9999999903 | Failed | CallRejection |             6 |           6 |        6 |           5 | 2013-12-19 13:07:53 |
|  4 | 9999999904 | Failed | Unavailable   |             2 |           4 |        2 |           0 | 2013-12-19 13:08:03 |
|  5 | 9999999905 | Failed | Misc          |             6 |           2 |        6 |           2 | 2013-12-19 13:07:01 |
|  6 | 9999999906 | Failed | NoAnswer      |             1 |           3 |        1 |           6 | 2013-12-19 13:07:24 |
|  7 | 9999999907 | Failed | NetworkBusy   |             6 |           6 |        2 |           3 | 2013-12-19 13:07:42 |
|  8 | 9999999908 | Failed | CallRejection |             8 |           3 |        3 |           0 | 2013-12-19 13:07:53 |
|  9 | 9999999909 | Failed | Unavailable   |             3 |           8 |        5 |           6 | 2013-12-19 13:08:03 |
| 10 | 9999999910 | Failed | Misc          |             8 |           4 |        0 |           4 | 2013-12-19 13:07:01 |
+----+------------+--------+---------------+---------------+-------------+----------+-------------+---------------------+

我想根据每一行的reason 列的值提取每个原因的值。例如:

row 1 应该给出2 作为结果,因为reason 列具有noanswer,因此应该返回该特定列的值,即noanswer

实际上,在将返回值与常量进行比较后,我必须选择多行。我可以通过以下方法做到这一点:

select @col := reason from msisdn_table where id=1;
SET @a = concat('select ', @col, ' from msisdn_table where id=1');
PREPARE STMT FROM @a;
EXECUTE STMT;
DEALLOCATE PREPARE STMT;

但这不是很有前途的解决方案,因为它只适用于一行,我必须使用 for 循环才能获得 1000 行的块,这不会很有效。更有效的方法是什么?

【问题讨论】:

    标签: mysql database performance


    【解决方案1】:

    试试这个:

    SELECT id, 
           reason
           CASE
             WHEN reason = 'NoAnswer' THEN NoAnswer
             WHEN reason = 'NetworkBusy' THEN NetworkBusy
           END AS value
    FROM table1
    

    它应该给你这样的输出:

    +----+------------+----------+
    | id | reason     | value    |
    +----+------------+----------+
    |  1 | NoAnswer   |        2 |
    +----+------------+----------+
    

    【讨论】:

    • 还有一件事,我可以对该值进行递增、递减等操作吗?
    • @Pankaj 是的,我认为您应该能够执行操作。像这样的东西会起作用:WHEN reason = 'NoAnswer' THEN NoAnswer + 1ORDER BY value
    • 不,我的意思是在检索原始表后更改它的值
    • @Pankaj 是的,您可以对原始表执行 UPDATE 语句,但除非您重新执行 SELECT 查询,否则该更新不会反映在 value 列中。
    • @Pankaj 我建议您在我退出时为此发布一个新问题,其他用户将能够为您提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    相关资源
    最近更新 更多