MySQL + PHP:在连接上选择多行,然后更新这些行/插入新行

时间:2011-09-28 02:44:26

标签: php mysql sql

我想做以下事情:

  1. 在两个表之间的INNER JOIN上选择多个行。
  2. 使用返回行的主键,可以:
    1. 更新这些行,或
    2. 使用返回的主键作为外键将行插入到另一个表中。
  3. 在PHP中,回显步骤#1的结果,理想情况下包含#2的结果(由客户端使用)。
  4. 我写了连接,但没有其他的。我尝试使用用户定义的变量来存储步骤#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字段或插入一个引用该小部件的新下载(我很乐意看到这两种方法的答案,尚未决定),然后允许回显连接的小部件和下载。如果新插入的下载或更新的小部件包含在回声中,则会获得奖励。

1 个答案:

答案 0 :(得分:0)

由于您询问是否可以在单个Mysql事务中执行此操作,因此我将提及cursors。游标将允许您执行选择并循环遍历每一行,并在数据库中执行插入或任何其他您想要的操作。所以你可以创建一个存储过程来完成你可以通过php调用的幕后所有逻辑。

根据您的更新,我想提一下,您可以让存储过程返回新记录集或我想要的任何内容。有关创建使用php返回记录集的存储过程的更多信息,您可以查看此帖子:http://www.joeyrivera.com/2009/using-mysql-stored-procedure-inout-and-recordset-w-php/