php - 如何更新 SELECT 语句的结果?

标签 php mysql sql pdo

我有一个这样的表:

// 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 查询(如果知道这一点很重要)

$stm = $db->prepare(" (SELECT id, ... ");
$stm->execute( /* passing some variables */);
$stm->fetchAll(PDO::FETCH_ASSOC);

最佳答案

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

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

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

关于php - 如何更新 SELECT 语句的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37468865/

相关文章:

php - 以编程方式确定哪个 FOREIGN KEY 约束失败

Php/MySql 建议

mysql - 多行的 SQL 条件

PHP SQL 插入数据库

php - 在php中将单个数组转换为多维数组

php - 如何启动 PHP 类并在多个文件中使用它?

python - 通过 MySQL 触发 Python(从 PHP)

mysql - 写入数据库时​​的编码问题 (Perl)

SQL:在 LIKE 语句内的查询参数上使用 REGEXP_REPLACE

PHP MySQL : How to determine if value already exists in database