MySQL查询在phpMyAdmin中工作,在PHP中失败

MySQL查询在phpMyAdmin中工作,在PHP中失败,php,mysql,phpmyadmin,Php,Mysql,Phpmyadmin,这个想法是,你有一个tbl_物质的主列表,如果你在tbl_物质列表或tbl_物质信息中输入了关于它们的任何信息,那么只要你使用正确的组织ID登录,这些信息就可以显示 重要的是要显示所有的物质,即使它们没有自定义信息,这就是为什么我使用左连接 此查询在phpMyAdmin中非常有效,但当我在数据库脚本中使用它时,我得到: 您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解要使用的正确语法,如第2行的“AS”LEFT JOIN SELECT subid、list1、list2、l

这个想法是,你有一个tbl_物质的主列表,如果你在tbl_物质列表或tbl_物质信息中输入了关于它们的任何信息,那么只要你使用正确的组织ID登录,这些信息就可以显示

重要的是要显示所有的物质,即使它们没有自定义信息,这就是为什么我使用左连接

此查询在phpMyAdmin中非常有效,但当我在数据库脚本中使用它时,我得到:

您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解要使用的正确语法,如第2行的“AS”LEFT JOIN SELECT subid、list1、list2、list3、list4、list5

我不确定这个问题是否是我明显遗漏了什么,还是因为这段代码使用了mysql_查询,我知道这是不推荐的、过时的等等

我不是一个数据库专家,所以如果你觉得这个查询很难看,那么我提前道歉

编辑2

下面是构建此查询的代码,它根据您搜索的内容动态构建,但这是基本形式

SELECT SQL_CALC_FOUND_ROWS * 
FROM (
   SELECT * 
   FROM tbl_substances
   LIMIT 0 , 25
) AS s
LEFT JOIN (
   SELECT subid, list1, list2, list3, list4, list5
   FROM tbl_substances_lists
   WHERE orgid =  '1'
) AS x ON s.subst_id = x.subid
LEFT JOIN (
   SELECT subid, info
   FROM tbl_substances_info
   WHERE orgid =  '1'
) AS y ON s.subst_id = y.subid

还没有分析代码,但是querywise没有看到语法错误。但我建议您这样写查询:

SELECT SQL_CALC_FOUND_ROWS * 
FROM (
  SELECT * 
  FROM tbl_substances LIMIT 0, 25
) AS s 
LEFT JOIN (
  SELECT subid, list1, list2, list3, list4, list5 
  FROM tbl_substances_lists 
  WHERE orgid = '1'
) AS x 
ON s.subst_id = x.subid 
LEFT JOIN (
  SELECT subid, info 
  FROM tbl_substances_info 
  WHERE orgid = '1'
) AS y 
ON s.subst_id = y.subid

应该会得到同样的结果。

在我的例子中,我使用的是ISO 8859-1字符Ã,Ã,é……,执行:utf8_decode$query;已解决此问题。

和/或在数据库中最终定义查询时转储查询。我不知道为什么要使用嵌套查询,但它们似乎有效!这是因为我想向用户展示数据库中所有物质的视图,以及他们可能输入的任何信息。如果这不是最好的办法,那么请告诉我。代码生成的SQL查询如问题开头所示。我不理解使用SQL\u CALC\u FOUND的目的_ROWS@njk这是其他人编写的代码,我正在为将来的使用进行调整-SQL\u CALC\u FOUND\u行在那里,因为数据被拉到一个电子表格类型的表中,我稍后运行SELECT FOUND\u ROWS以了解如何使用我返回了很多结果并正确格式化了所有内容。谢谢你的帮助。我尝试过这个查询,但它比我的目标要慢。我想这是因为它连接了整个物质数据库~100000条记录。我试图限制第一次查询的原因是为了加快查询速度以供参考,此查询需要约12秒才能完成;页面顶部的查询需要0.0063秒!您应该通过添加适当的索引来获得相同的性能。100000条记录其实并不多。谢谢,想象一下你正在和一个非常愚蠢的人打交道……你会建议哪里有合适的索引?最简单的方法是:在查询前面加上EXPLAIN关键字,并可选地加上一个\G而不是;最后。\G只是很好地格式化了它。然后您可以查看是否使用了索引以及使用了什么索引。发布结果以及来自SHOW CREATE TABLE tbl_substances和其他两个表格的结果。那么我可以肯定地告诉你,但我已经怀疑你加入的专栏和/或更有可能是orgid专栏。
SELECT SQL_CALC_FOUND_ROWS * 
FROM (
  SELECT * 
  FROM tbl_substances LIMIT 0, 25
) AS s 
LEFT JOIN (
  SELECT subid, list1, list2, list3, list4, list5 
  FROM tbl_substances_lists 
  WHERE orgid = '1'
) AS x 
ON s.subst_id = x.subid 
LEFT JOIN (
  SELECT subid, info 
  FROM tbl_substances_info 
  WHERE orgid = '1'
) AS y 
ON s.subst_id = y.subid
SELECT SQL_CALC_FOUND_ROWS * 
FROM tbl_substances s
LEFT JOIN tbl_substances_lists x ON s.subst_id = x.subid AND x.orgid = '1'
LEFT JOIN tbl_substances_info y ON s.subst_id = y.subid AND y.orgid = '1'
LIMIT 0, 25