我有一个可以在MySQL环境中正常运行的MySQL查询,但是当在PHP中运行时却不能,因为它在每种情况(记录)下都显示REGION,PROVINCIA,COMUNA相同的值,而不是属于每个独立记录的正确值,因为它们可能彼此不同。

我需要找到一种合适的SQL语句进行查询,以使我能够获取查询中涉及的每个记录(3)的实际REGION,PROVINCIA,COMUNA。

表pos1postul,pos2pad和pos3mad上的记录通过字段REGION_ID,PROVINCIA_ID,COM​​UNA_ID引用表dir_region,dir_provincia和dir_comuna。

任何帮助都感激不尽。

SELECT * FROM db3.pos1postul

INNER JOIN db3.dir_region AS region1 ON pos1postul.pos1_region=region1.REGION_ID
INNER JOIN db3.dir_provincia AS provincia1 ON  pos1postul.pos1_prov=provincia1.PROVINCIA_ID
INNER JOIN db3.dir_comuna AS comuna1 ON pos1postul.pos1_comu=comuna1.COMUNA_ID, db3.pos2pad

INNER JOIN db3.dir_region AS region2 ON pos2pad.pos2_regionpad=region2.REGION_ID
INNER JOIN db3.dir_provincia AS provincia2 ON     pos2pad.pos2_provpad=provincia2.PROVINCIA_ID
INNER JOIN db3.dir_comuna AS comuna2 ON pos2pad.pos2_comupad=comuna2.COMUNA_ID, db3.pos3mad

INNER JOIN db3.dir_region AS region3 ON pos3mad.pos3_regionmad=region3.REGION_ID
INNER JOIN db3.dir_provincia AS provincia3 ON  pos3mad.pos3_provmad=provincia3.PROVINCIA_ID
INNER JOIN db3.dir_comuna AS comuna3 ON pos3mad.pos3_comumad=comuna3.COMUNA_ID

WHERE pos1_aluID='n'
AND pos2_padID=pos1_IDpostulpad
AND pos3_madID=pos1_IDpostulmad


PHP代码:

$idpostul_rsPostul = "-1";
if (isset($idpostul)) {
  $idpostul_rsPostul = $idpostul;
}
mysql_select_db($database_conndb3, $conndb3);
$query_rsPostul = sprintf("SELECT * FROM db3.pos1postul INNER JOIN db3.dir_region AS     region1 ON pos1postul.pos1_region=region1.REGION_ID INNER JOIN db3.dir_provincia AS     provincia1 ON pos1postul.pos1_prov=provincia1.PROVINCIA_ID INNER JOIN db3.dir_comuna AS     comuna1 ON  pos1postul.pos1_comu=comuna1.COMUNA_ID, db3.pos2pad INNER JOIN db3.dir_region AS region2 ON pos2pad.pos2_regionpad=region2.REGION_ID  INNER JOIN db3.dir_provincia AS provincia2 ON pos2pad.pos2_provpad=provincia2.PROVINCIA_ID INNER JOIN db3.dir_comuna AS comuna2 ON  pos2pad.pos2_comupad=comuna2.COMUNA_ID, db3.pos3mad INNER JOIN db3.dir_region AS region3 ON pos3mad.pos3_regionmad=region3.REGION_ID  INNER JOIN db3.dir_provincia AS provincia3 ON pos3mad.pos3_provmad=provincia3.PROVINCIA_ID INNER JOIN db3.dir_comuna AS comuna3 ON  pos3mad.pos3_comumad=comuna3.COMUNA_ID WHERE pos1_aluID=%s AND pos2_padID=pos1_IDpostulpad AND pos3_madID=pos1_IDpostulmad",  GetSQLValueString($idpostul_rsPostul, "int"));
$rsPostul = mysql_query($query_rsPostul, $conndb3) or die(mysql_error());
$row_rsPostul = mysql_fetch_assoc($rsPostul);

最佳答案

我看不到您的代码中定义了GetSQLValueString()


我猜它和this one一样吗?如果是这样,您的PHP代码似乎还可以,但是与您的原始SQL(原始SQL中的pos1_aluID='n'与PHP的SQL中的pos1_aluID=<some integer here>)不同。
我建议您打印出PHP(print $query_rsPostul;)中的SQL,将其复制并粘贴到Workbench,然后运行它并检查它是否是您想要的。

我看不到您如何在代码中使用mysql_fetch_assoc()的结果。


mysql_fetch_assoc()仅获得结果集的一行。要获取所有行,请使用循环,例如

while ($row_rsPostul = mysql_fetch_assoc($rsPostul)) {
    // Do something with $row_rsPostul here.
}






编辑(2012-12-16):


也许您的查询结果中具有相同名称的列?


您需要使用列别名,例如

SELECT region1.REGION_ID as region1_REGION_ID,
       region2.REGION_ID as region2_REGION_ID,
       region3.REGION_ID as region3_REGION_ID,
       ....


然后,您可以使用$row_rsPostu["region1_REGION_ID"]$row_rsPostu["region2_REGION_ID"]等访问它们。

也许您没有为数据库连接设置字符集?


如果您的连接使用的字符集与数据库/表/列的字符集不同,则可能会出错。在mysql_set_charset("utf8", $conndb3)之后和"utf8"之前尝试mysql_connect()(用字符集替换mysql_select_db())。

仔细检查您的数据库名称($database_conndb3)和连接参数(即您在mysql_connect()中输入的参数),确保它们与Workbench中使用的参数相同。




最后,请注意,自PHP 5.5.0起,PHP中的旧mysql扩展已被弃用,以后将被删除。看到


mysql_select_db()
mysql_query()
mysql_error()
mysql_fetch_assoc()
Choosing an API
PHP: mysql v mysqli v pdo

关于php - MySQL查询在Workbench中工作正常,但在PHP中略有不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13872363/

10-10 00:53