我想做以下事情:
我写了连接,但没有其他的。我尝试使用用户定义的变量来存储步骤#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 vars:
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
字段或插入一个引用该小部件的新下载(我很乐意看到这两种方法的答案,尚未决定),然后允许回显连接的小部件和下载。如果新插入的下载或更新的小部件包含在回声中,则会获得奖励。
答案 0 :(得分:0)
由于您询问是否可以在单个Mysql事务中执行此操作,因此我将提及cursors。游标将允许您执行选择并循环遍历每一行,并在数据库中执行插入或任何其他您想要的操作。所以你可以创建一个存储过程来完成你可以通过php调用的幕后所有逻辑。
根据您的更新,我想提一下,您可以让存储过程返回新记录集或我想要的任何内容。有关创建使用php返回记录集的存储过程的更多信息,您可以查看此帖子:http://www.joeyrivera.com/2009/using-mysql-stored-procedure-inout-and-recordset-w-php/