本文将为您提供关于PHP/MySQL-同时进行多个查询的详细介绍,同时,我们还将为您提供关于c#–如何使用MysqlDataReader运行多个查询、mysql-MYSQL如何进行多字段同时筛选,获取
本文将为您提供关于PHP / MySQL-同时进行多个查询的详细介绍,同时,我们还将为您提供关于c# – 如何使用MysqlDataReader运行多个查询、mysql-MYSQL如何进行多字段同时筛选,获取不同的值、MySQLdb.cursor.execute无法运行多个查询、Mysqli不允许多个查询?的实用信息。
本文目录一览:- PHP / MySQL-同时进行多个查询
- c# – 如何使用MysqlDataReader运行多个查询
- mysql-MYSQL如何进行多字段同时筛选,获取不同的值
- MySQLdb.cursor.execute无法运行多个查询
- Mysqli不允许多个查询?
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运行多个查询
我用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如何进行多字段同时筛选,获取不同的值
有一个表,数据是这样的
品名 规格 材质 厂家 价格 城市 添加日期螺纹钢 Φ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无法运行多个查询
我们正在尝试将包含多个插入语句的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以拆分语句(需要进行所有转义和引号处理)才能在多个execute
s中运行它们?
答案1
小编典典显然,在MySQLdb
(aka。MySQL-python
)中无法执行此操作,因此我们最终只是communicate
将数据写入subprocess.Popen([mysql, ...],stdin=subprocess.PIPE)
并检查returncode
。
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不允许多个查询?等相关内容,可以在本站寻找。
本文标签: