GVKun编程网logo

PHP / MySQL-同时进行多个查询

13

本文将为您提供关于PHP/MySQL-同时进行多个查询的详细介绍,同时,我们还将为您提供关于c#–如何使用MysqlDataReader运行多个查询、mysql-MYSQL如何进行多字段同时筛选,获取

本文将为您提供关于PHP / MySQL-同时进行多个查询的详细介绍,同时,我们还将为您提供关于c# – 如何使用MysqlDataReader运行多个查询、mysql-MYSQL如何进行多字段同时筛选,获取不同的值、MySQLdb.cursor.execute无法运行多个查询、Mysqli不允许多个查询?的实用信息。

本文目录一览:

PHP / MySQL-同时进行多个查询

PHP / MySQL-同时进行多个查询

我有24个数据库,其中的表标记为email_queue

我有另一个数据库,其中包含该表的所有数据库的列表email_queue

我遍历数据库列表并查询我的email_queue表以为每个数据库发送邮件。

这个问题是,PHP脚本被搁置了,比方说,第3个数据库,同时发送500封电子邮件,然后离开其他数据库等待轮到他们。

我试图弄清楚如何同时查询所有24个数据库并同时发送电子邮件队列。

有什么建议?

答案1

小编典典

使用curl_multi_open可以做到这一点

将您的脚本分成两部分,您可以使一个php文件(例如email_out.php)具有数据库名称(或一些用于查找数据库名称的变量,该开关将位于for循环中或位于email_out.php中)
,然后基于该脚本进行大量电子邮件发送。

第二部分使用curl_multi_open多次打开email_out.php脚本,有效地创建了到不同数据库的多个单独连接,这些脚本都可以在不同时间解析,因为它们都是并行运行的。本质上,您的循环现在是使用不同的参数多次将脚本添加到curl_multi_open,然后异步执行所有脚本。

class Fork{    private $_handles = array();    private $_mh      = array();    function __construct()    {        $this->_mh = curl_multi_init();    }    function add($url)    {        $ch = curl_init();        curl_setopt($ch, CURLOPT_URL, $url);        curl_setopt($ch, CURLOPT_HEADER, 0);        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);        curl_setopt($ch, CURLOPT_TIMEOUT, 30);        curl_multi_add_handle($this->_mh, $ch);        $this->_handles[] = $ch;        return $this;    }    function run()    {        $running=null;        do {            curl_multi_exec($this->_mh, $running);            usleep (250000);        } while ($running > 0);        for($i=0; $i < count($this->_handles); $i++) {            $out = curl_multi_getcontent($this->_handles[$i]);            $data[$i] = json_decode($out);            curl_multi_remove_handle($this->_mh, $this->_handles[$i]);        }        curl_multi_close($this->_mh);        return $data;    }}

(来自http://gonzalo123.com/2010/10/11/speed-up-php-scripts-with-asynchronous-
database-queries/)

因此,您的循环将如下所示:

$fork = new Fork;for ($i = 0; $i < 24; $i++) {    $fork->add("email_out.php?t=" . $i);}$fork->run();

c# – 如何使用MysqlDataReader运行多个查询

c# – 如何使用MysqlDataReader运行多个查询

我正在尝试在我的代码中进行多个查询,如下所示,但它会在 MySqlDataReader行抛出异常rdr_get_latest_build_notes = get_latest_build_notes_cmd.ExecuteReader();因为我已经开了一个rdr

我用Google搜索并发现@ according to MSDN不受支持,我需要有关如何修复它的指导?

public IEnumerable<BuildNotes_op> RetrieveBuildDetails(string BuildID)
    {
        ....
        var conn = new MysqL.Data.MysqLClient.MysqLConnection();
        conn.ConnectionString = AciDev.aciDevConnectionString;
        try
        {
            Console.WriteLine("Connecting to MysqL...");
            conn.open();
            string sql = @"query1";
            MysqLCommand cmd = new MysqLCommand(sql,conn);
            MysqLDataReader rdr = cmd.ExecuteReader(); --> **rdr open here**
            ....

            while (rdr.Read())
            {
                .....
                if (rdr[4] != dbnull.Value)
                    ....................
                else
                     ........
                     string sql_get_latest_build_notes_cmd = "query2";

                     MysqLCommand get_latest_build_notes_cmd = new MysqLCommand(sql_get_latest_build_notes_cmd,conn);
                     MysqLDataReader rdr_get_latest_build_notes = get_latest_build_notes_cmd.ExecuteReader();  --> **throws exception here**
                     if (rdr_get_latest_build_notes.HasRows)
                    {
                      ....................

                    }
                     rdr_get_latest_build_notes.Close();

                if (BuildDetails != null)
                {
                    BuildNotesDetails.Add(BuildDetails);
                }
            }
            rdr.Close();
            conn.Close();
            return BuildNotesDetails;
        }

        catch
        {
            throw;
        }
        finally
        {
            conn.Close();
        }

例外:

There is already an open DataReader associated with this Connection which must be closed first.

解决方法

试试这个:

public IEnumerable<BuildNotes_op> RetrieveBuildDetails(string BuildID)
    {

        var conn = new MysqL.Data.MysqLClient.MysqLConnection();
         var conn2 = new MysqL.Data.MysqLClient.MysqLConnection();
        conn.ConnectionString = AciDev.aciDevConnectionString;
        try
        {
            Console.WriteLine("Connecting to MysqL...");
            conn.open();
            string sql = @"query1";
            MysqLCommand cmd = new MysqLCommand(sql,conn);
            MysqLDataReader rdr = cmd.ExecuteReader(); --> **rdr open here**
            ....

            while (rdr.Read())
            {
                .....
                if (rdr[4] != dbnull.Value)
                    ....................
                else
                     ........
                     string sql_get_latest_build_notes_cmd = "query2";

                     conn2.ConnectionString = AciDev.aciDevConnectionString;

                 Console.WriteLine("Connecting to MysqL...");
                  conn2.open();
                     MysqLCommand get_latest_build_notes_cmd = new MysqLCommand(sql_get_latest_build_notes_cmd,conn2);
                     MysqLDataReader rdr_get_latest_build_notes = get_latest_build_notes_cmd.ExecuteReader();  --> **throws exception here**
                     if (rdr_get_latest_build_notes.HasRows)
                    {
                      ....................

                    }
                     rdr_get_latest_build_notes.Close();
                    conn2.Close();

                if (BuildDetails != null)
                {
                    BuildNotesDetails.Add(BuildDetails);
                }
            }
            rdr_get_latest_build_notes.Close();
            rdr.Close();
            conn.Close();
            conn2.Close();
            return BuildNotesDetails;
        }

        catch
        {
            throw;
        }
        finally
        {
            rdr_get_latest_build_notes.Close();
            rdr.Close();
            conn.Close();
            conn2.Close();
        }

创建第二个连接var

mysql-MYSQL如何进行多字段同时筛选,获取不同的值

mysql-MYSQL如何进行多字段同时筛选,获取不同的值

mysql

有一个表,数据是这样的

 品名 规格  材质  厂家  价格  城市  添加日期螺纹钢   Φ12-14 HRB400E 成实  2370    北京  2015-11-6 10:33螺纹钢   Φ12-14 HRB400E 龙钢  2370    北京  2015-11-6 10:33螺纹钢   Φ12-14 HRB400E 德胜  2370    北京  2015-11-6 10:33螺纹钢   Φ12-14 HRB400E 威钢  2440    北京  2015-11-6 10:33螺纹钢   Φ16-25 HRB400E 新钢业   2300    广州  2015-11-6 10:23螺纹钢   Φ16-25 HRB400E 水钢  2300    广州  2015-11-6 10:23螺纹钢   Φ16-25 HRB400E 攀钢  2300    广州  2015-11-6 10:23高线  Φ6.5-10    HPB300  山西中阳    2340    上海  2015-11-6 10:13高线  Φ6.5-10    HPB300  山西立恒    2340    上海  2015-11-6 10:13高线  Φ6.5-10    HPB300  龙钢  2340    上海  2015-11-6 10:13螺纹钢   Φ16-25 HRB400E 山西建邦    2370    武汉  2015-11-6 10:22螺纹钢   Φ16-25 HRB400E 龙钢  2370    武汉  2015-11-6 10:22螺纹钢   Φ16-25 HRB400E 德胜  2370    武汉  2015-11-6 10:22螺纹钢   Φ8-10  HRB400E 威钢  2430    武汉  2015-11-6 10:22
登录后复制

想获得:
根据时间 、城市 、品名,同时判断这三个字段,获取不同的值,然后每个值只取其中一条。
按添加时间排序。形成列表。表里(有ID字段的)

MSSQL是这样的,可以实现:

 select  *            from (select *,rank() over (partition by AddDate,City order by ID) rn            from mart  WHERE Title = ''螺纹钢'' and DATEDIFF(day,AddDate,getdate())<p>现在我想把它转换成MYSQL的语句,该如何写呢?</p>        
登录后复制

MySQLdb.cursor.execute无法运行多个查询

MySQLdb.cursor.execute无法运行多个查询

我们正在尝试将包含多个插入语句的SQL文件作为一个查询运行,但是rollback当任何一个语句包含错误时,它似乎都会失败。

MySQLd配置:

sql_mode = STRICT_ALL_TABLESdefault-storage-engine = innodb

Python代码:

from contextlib import closingimport MySQLdbdatabase_connection = MySQLdb.connect(host="127.0.0.1", user="root")with closing(database_connection.cursor()) as cursor:    database_connection.begin()    cursor.execute(''DROP DATABASE IF EXISTS db_name'')    cursor.execute(''CREATE DATABASE db_name'')    cursor.execute(''USE db_name'')    cursor.execute(''CREATE TABLE table_name(first_field INTEGER)'')with closing(database_connection.cursor()) as cursor:    try:        database_connection.begin()        cursor.execute(''USE db_name'')        cursor.execute(''INSERT INTO table_name VALUES (1)'')        cursor.execute(''INSERT INTO table_name VALUES ("non-integer value")'')        database_connection.commit()    except Exception as error:        print("Exception thrown: {0}".format(error))        database_connection.rollback()        print("Rolled back")with closing(database_connection.cursor()) as cursor:    try:        database_connection.begin()        cursor.execute(''USE db_name'')        cursor.execute(''INSERT INTO table_name VALUES (1); INSERT INTO table_name VALUES ("non-integer value")'')        database_connection.commit()    except:        print("Exception thrown: {0}".format(error))        database_connection.rollback()        print("Rolled back")

预期结果:打印两次“抛出异常”和“回滚”。

使用MySQL-python 1.2.4的实际结果:

Exception thrown: (1366, "Incorrect integer value: ''non-integer value'' for column ''first_field'' at row 1")Rolled backException thrown: (1366, "Incorrect integer value: ''non-integer value'' for column ''first_field'' at row 1")Traceback (most recent call last):  File "test.py", line 30, in <module>    print("Rolled back")  File ".../python-2.7/lib/python2.7/contextlib.py", line 154, in __exit__    self.thing.close()  File ".../virtualenv-python-2.7/lib/python2.7/site-packages/MySQLdb/cursors.py", line 100, in close    while self.nextset(): pass  File ".../virtualenv-python-2.7/lib/python2.7/site-packages/MySQLdb/cursors.py", line 132, in nextset    nr = db.next_result()_mysql_exceptions.OperationalError: (1366, "Incorrect integer value: ''non-integer value'' for column ''first_field'' at row 1")

是什么赋予了?我们是否真的必须解析SQL以拆分语句(需要进行所有转义和引号处理)才能在多个executes中运行它们?

答案1

小编典典

显然,在MySQLdb(aka。MySQL-python)中无法执行此操作,因此我们最终只是communicate将数据写入subprocess.Popen([mysql, ...],stdin=subprocess.PIPE)并检查returncode

Mysqli不允许多个查询?

Mysqli不允许多个查询?

我在PHP中运行一个脚本,该脚本uisng循环为MySQL创建了一个字符串查询。

执行脚本后,出现以下错误:

“您的SQL语法有错误;请查看与您的MySQL服务器版本相对应的手册,以在’UPDATE BANNERS SET pos = 1 WHERE BID =
5; UPDATE BANNERS SET pos = 2 WHERE BID = 1’附近使用正确的语法。在第2行

在错误之后,我立即回显查询,它看起来像这样:

UPDATE BANNERS SET pos=0 WHERE BID=6;
UPDATE BANNERS SET pos=1 WHERE BID=5;
UPDATE BANNERS SET pos=2 WHERE BID=1;

当我将其复制并粘贴到phpmyadmin中时,它显然可以执行而没有任何问题。

有任何想法吗?

这是PHP代码:

有一个看起来像这样的数组:

$order[0] = 'tr_6';
$order[1] = 'tr_5';
$order[2] = 'tr_1';

$query = "";

foreach($order as $pos => $value){
   $idvalue = str_replace('tr_','',$value);
   $query .= "UPDATE BANNERS  SET pos=$pos WHERE BID=$idvalue;\n";
}

mysqli_query($connection,$query) or die(mysqli_error($connection)."<br/>$query");

谢谢!

关于PHP / MySQL-同时进行多个查询的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于c# – 如何使用MysqlDataReader运行多个查询、mysql-MYSQL如何进行多字段同时筛选,获取不同的值、MySQLdb.cursor.execute无法运行多个查询、Mysqli不允许多个查询?等相关内容,可以在本站寻找。

本文标签: