我想做以下事情:
- 在两个表之间的 INNER JOIN 中选择多个行。
- 使用返回行的主键,或者:
- 更新那些行,或者
- 使用返回的主键作为外键将行插入到不同的表中。
- 在 PHP 中,输出步骤 #1 的结果,最好包含步骤 #2 的结果(供客户端使用)。
我已经编写了连接,但没有写太多其他内容。我尝试使用用户定义的变量来存储步骤 #1 中的主键以在步骤 #2 中使用,但据我了解,用户定义的变量是单值的,我的 SELECT 可以返回多行。有没有办法在单个 MySQL 事务中执行此操作?如果没有,是否有某种方法可以提高效率?
更新:以下是我关注的表的架构(名称已更改,'natch):
CREATE TABLE IF NOT EXISTS `widgets` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`author` varchar(75) COLLATE utf8_unicode_ci NOT NULL,
`text` varchar(500) COLLATE utf8_unicode_ci NOT NULL,
`created` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated` timestamp
NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS `downloads` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`widget_id` int(11) unsigned NOT NULL,
`lat` float NOT NULL,
`lon` float NOT NULL,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
我目前正在做一个连接,让所有小部件与其下载配对。假设 $author
和 $batchSize
是 php 变量:
SELECT w.id, w.author, w.text, w.created, d.lat, d.lon, d.date
FROM widgets AS w
INNER JOIN downloads AS d
ON w.id = d.widget_id
WHERE w.author NOT LIKE '$author'
ORDER BY w.updated ASC
LIMIT $batchSize;
理想情况下,我的查询会得到一堆小部件,更新它们的 updated
字段或插入一个引用该小部件的新下载(我很想看到这两种方法的答案,还没有决定一个yet),然后允许加入的小部件和下载被回显。如果回显中包含新插入的下载或更新的小部件,则可加分。
最佳答案
既然你问过你是否可以在单个 Mysql 事务中做到这一点,我会提到 cursors .游标将允许您进行选择并循环遍历每一行,并在数据库中执行插入或您想要的任何其他操作。因此,您可以创建一个存储过程来执行您可以通过 php 调用的所有幕后逻辑。
根据您的更新,我想提一下,您可以让存储过程返回新记录集或 I'd,任何您想要的。有关使用 php 创建返回记录集的存储过程的更多信息,您可以查看这篇文章:http://www.joeyrivera.com/2009/using-mysql-stored-procedure-inout-and-recordset-w-php/
关于php - MySQL + PHP : select multiple rows on a join, 然后更新那些行/插入新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7577772/