所以我有一个相对较长的查询如下:
SELECT (
(CASE Methanethiol
WHEN -1 THEN 0
ELSE Methanethiol
END)
+
...
+
(CASE nHeptanethiol
WHEN -1 THEN 0
ELSE nHeptanethiol
END)
)
FROM condensates.mercaptans
WHERE (
(CASE Methanethiol
WHEN -1 THEN 0
ELSE Methanethiol
END)
+
...
+
(CASE nHeptanethiol
WHEN -1 THEN 0
ELSE nHeptanethiol
END)
) IS NOT NULL
问题是查询在MySQL管理员中运行得很好,但是当我添加4列以上并且给我一个NULL结果时,PHP似乎会扼杀它。有小费吗?另外,我是否遗漏了一些简单的方法来简单地为整个SELECT参数设置NOT NULL条件而不是将其再次复制出去?
编辑:根据要求,调用此查询的PHP如下...
第一个函数调用是:
$ mr = avg(查询($ property,'mercaptans',$ dates ['mostRec']),$ property);
其中query和avg定义为:
function avg($query, $colName){
$iter=0;
$sum=0;
while($row = mysql_fetch_array($query)) {
if($row[0]!==NULL){
$iter++;
$sum += ($row[$colName]==-1) ? 0 : $row[$colName];
}
}
mysql_free_result($query);
if ($iter==0)
return '-';
else {
$avg = ($sum / $iter);
if(lessThanMDL($avg, $colName))
return 'ND';
else
return $avg;
}
}
function query($selectWhat, $fromTable, $sampleIDs,$orderBySampIDAsc='false'){
$query = "SELECT ";
$query .= mysql_real_escape_string($selectWhat);
$query .= " FROM ";
$query .= mysql_real_escape_string($fromTable);
if(count($sampleIDs) >= 1) {
$query .= " WHERE (";
$iter=0;
while($iter < count($sampleIDs)-1){
$query .= "(SampleID=" . >mysql_real_escape_string($sampleIDs[$iter]) . ") OR ";
$iter++;
}
$query .= "(SampleID=" . >mysql_real_escape_string($sampleIDs[$iter]) . "))";
$query .= " AND " . mysql_real_escape_string($selectWhat) . " IS NOT NULL";
} else {
$query .= " WHERE SampleID=0"; # always returns nothing
}
if($orderBySampIDAsc=='true')
$query .= " ORDER BY SampleID ASC";
global $condensatesdb;
return mysql_query($query, $condensatesdb);
}
对不起它是如此间隔 - 我似乎无法将其格式化。无论如何,这段代码在页面上可能接近30个其他查询,但只是失败了。
答案 0 :(得分:0)
哦,我的,那段代码很乱。什么都无法解决。
$query = "SELECT ";
$query .= mysql_real_escape_string($selectWhat);
如果您在字符串中有两个内容(如foo, bar
),则会失败,并且如果您将这些内容传递出去,则会完全删除您的括号中的内容。
$query .= " FROM ";
$query .= mysql_real_escape_string($fromTable);
FROM子句中的表使用不同的引用规则而不是普通数据。不要通过字符串转义来运行它。
您可能希望考虑切换到提供like PDO的数据库访问层prepared statements & placeholders。
if($orderBySampIDAsc=='true')
PHP有真正的布尔值。您不应该尝试将布尔状态表示为字符串。
现在,所有这些,我看不出您编写的query
函数如何创建您在问题顶部提供的SQL!在调用print $query
之前,您可以在函数底部引入mysql_query
,看看实际生成了什么?然后你可以复制&amp;将它粘贴到phpmyadmin中,看看它到底是多么神圣/疯狂。
答案 1 :(得分:0)
您可以使用 HAVING 关键字重写上述查询:
SELECT
(CASE Methanethiol
WHEN -1 THEN 0
ELSE Methanethiol
END)
+
...
+
(CASE nHeptanethiol
WHEN -1 THEN 0
ELSE nHeptanethiol
END)
AS matches
FROM condensates.mercaptans
HAVING matches > 0