Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何更新SELECT语句的结果?_Php_Mysql_Sql_Pdo - Fatal编程技术网

Php 如何更新SELECT语句的结果?

Php 如何更新SELECT语句的结果?,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,我有一张这样的桌子: // notifications +----+--------------+------+---------+------------+ | id | event | seen | id_user | time_stamp | +----+--------------+------+---------+------------+ | 1 | vote | 1 | 123 | 1464174617 | | 2 | comment

我有一张这样的桌子:

// notifications
+----+--------------+------+---------+------------+
| id |      event   | seen | id_user | time_stamp |
+----+--------------+------+---------+------------+
| 1  | vote         | 1    | 123     | 1464174617 |
| 2  | comment      | 1    | 456     | 1464174664 |
| 3  | vote         | 1    | 123     | 1464174725 |
| 4  | answer       | 1    | 123     | 1464174813 |
| 5  | comment      | NULL | 456     | 1464174928 |
| 6  | comment      | 1    | 123     | 1464175114 |
| 7  | vote         | NULL | 456     | 1464175317 |
| 8  | answer       | NULL | 123     | 1464175279 |
| 9  | vote         | NULL | 123     | 1464176618 |
+----+--------------+------+---------+------------+ 
我的问题是:

(SELECT id, event, seen, time_stamp 
 FROM notifications n
 WHERE id_user = :id AND seen IS NULL
)UNION
(SELECT id, event, seen, time_stamp
 FROM notification n
 WHERE id_user = :id AND seen IS NOT NULL
 LIMIT 2
)UNION 
(SELECT id, event, seen, time_stamp 
 FROM notifications n
 WHERE id_user = :id 
 ORDER BY (seen IS NULL) desc, time_stamp desc
 LIMIT 15
)
ORDER BY (seen IS NULL) desc, time_stamp desc;

现在,我正在尝试更新上面查询中匹配的行,并设置
seen=1
,如下所示:

UPDATE notifications SET seen = 1 WHERE /* the result of query above */
我该怎么做


注意:我还使用PHP和PDO来执行SELECT查询(如果知道这一点很重要的话)


我想你可以用where in子句。。但在这种情况下,你需要一个身份证

    UPDATE notifications SET seen = 1 WHERE id in (
    (SELECT id
     FROM notifications n
     WHERE id_user = :id AND seen IS NULL
    )UNION
    (SELECT id
     FROM notification n
     WHERE id_user = :id AND seen IS NOT NULL
     LIMIT 2
    )UNION 
    (SELECT id
     FROM notifications n
     WHERE id_user = :id 
     ORDER BY (seen IS NULL) desc, time_stamp desc
     LIMIT 15
    ))

我想你可以用where in子句。。但在这种情况下,你需要一个身份证

    UPDATE notifications SET seen = 1 WHERE id in (
    (SELECT id
     FROM notifications n
     WHERE id_user = :id AND seen IS NULL
    )UNION
    (SELECT id
     FROM notification n
     WHERE id_user = :id AND seen IS NOT NULL
     LIMIT 2
    )UNION 
    (SELECT id
     FROM notifications n
     WHERE id_user = :id 
     ORDER BY (seen IS NULL) desc, time_stamp desc
     LIMIT 15
    ))

您可以稍微修改查询以用作update语句的子查询:

UPDATE notifications SET seen = 1 WHERE id in (
    (SELECT id
     FROM notifications n
     WHERE id_user = :id AND seen IS NULL
    )UNION
    (SELECT id
     FROM notification n
     WHERE id_user = :id AND seen IS NOT NULL
     LIMIT 2
    )UNION 
    (SELECT id
     FROM notifications n
     WHERE id_user = :id 
     ORDER BY (seen IS NULL) desc, time_stamp desc
     LIMIT 15
    )
)

您可以稍微修改查询以用作update语句的子查询:

UPDATE notifications SET seen = 1 WHERE id in (
    (SELECT id
     FROM notifications n
     WHERE id_user = :id AND seen IS NULL
    )UNION
    (SELECT id
     FROM notification n
     WHERE id_user = :id AND seen IS NOT NULL
     LIMIT 2
    )UNION 
    (SELECT id
     FROM notifications n
     WHERE id_user = :id 
     ORDER BY (seen IS NULL) desc, time_stamp desc
     LIMIT 15
    )
)

我假设您已将所有适用的ID检索到应用程序中。你需要做的就是

UPDATE notifications
SET seen = 1
WHERE id IN (?,?,?)

其中,
被id值替换。

我假设您已将所有适用的id检索到应用程序中。你需要做的就是

UPDATE notifications
SET seen = 1
WHERE id IN (?,?,?)

其中,
被id值替换。

如果要在MySQL中执行此操作,请使用
JOIN

update notifications n join
       (select id
        from ((SELECT id, event, seen, time_stamp 
               FROM notifications n
               WHERE id_user = :id AND seen IS NULL
              ) UNION
              (SELECT id, event, seen, time_stamp
               FROM notification n
               WHERE id_user = :id AND seen IS NOT NULL
               LIMIT 2
              ) UNION 
              (SELECT id, event, seen, time_stamp 
               FROM notifications n
               WHERE id_user = :id 
               ORDER BY (seen IS NULL) desc, time_stamp desc
               LIMIT 15
              )) n
       ) nids
       on n.id = nids.id
    set seen = 1;

如果要在MySQL中执行此操作,请使用
JOIN

update notifications n join
       (select id
        from ((SELECT id, event, seen, time_stamp 
               FROM notifications n
               WHERE id_user = :id AND seen IS NULL
              ) UNION
              (SELECT id, event, seen, time_stamp
               FROM notification n
               WHERE id_user = :id AND seen IS NOT NULL
               LIMIT 2
              ) UNION 
              (SELECT id, event, seen, time_stamp 
               FROM notifications n
               WHERE id_user = :id 
               ORDER BY (seen IS NULL) desc, time_stamp desc
               LIMIT 15
              )) n
       ) nids
       on n.id = nids.id
    set seen = 1;

seen
只能是
1
null
。在这种情况下,您从UNION查询中获得的大部分信息都是无关的。在我看来,您尝试进行的更新的最终结果将是:

UPDATE notifications SET seen = 1 WHERE id_user = :id AND seen IS NULL

其他任何操作都将把已经
1
的内容更新为
1

可见的
只能是
1
。在这种情况下,您从UNION查询中获得的大部分信息都是无关的。在我看来,您尝试进行的更新的最终结果将是:

UPDATE notifications SET seen = 1 WHERE id_user = :id AND seen IS NULL

其他任何东西都会将已经
1
的东西更新为
1

老实说,我知道这一点。但我认为有一个更简单的解决办法。tnx无论如何,我的意思是我可以将ID的数量存储到一个PHP变量中,并在
update
语句中使用它吗?像这样的
更新。WHERE id IN(“.$ids.”)
是的,您可以在注释中使用格式化字符串,但也可以使用IN子句的数组。。。有一些关于stackoverflowWell的建议,老实说,我知道。但我认为有一个更简单的解决办法。tnx无论如何,我的意思是我可以将ID的数量存储到一个PHP变量中,并在
update
语句中使用它吗?像这样的
更新。WHERE id IN(“.$ids.”)
是的,您可以在注释中使用格式化字符串,但也可以使用IN子句的数组。。。有一些关于StackOverflow的建议是正确的,请告诉我如何从
$result=$stm->fetchAll()提取所有ID
并将其用于
UPDATE
语句?没错,请您告诉我如何从
$result=$stm->fetchAll()提取所有ID
并将其用于
UPDATE
语句?seen
可以使用哪些其他值?
seen
只接受两个值,
NULL
(未读消息),
1
(读取消息)seen
可以使用哪些其他值?
seen
只接受两个值,
NULL
(未读邮件),
1
(阅读邮件)