2012-09-03 51 views
0

我有以下代码..MySQL的顺序由问题

echo "<form><center><input type=submit name=subs value='Submit'></center></form>"; 

$val=$_POST['resulta']; //this is from a textarea name='resulta' 
if (isset($_POST['subs'])) //from submit name='subs' 
{ 
    $aa=mysql_query("select max(reservno) as 'maxr' from reservation") or die(mysql_error()); //select maximum reservno 
    $bb=mysql_fetch_array($aa); 
    $cc=$bb['maxr']; 
    $lines = explode("\n", $val); 
    foreach ($lines as $line) { 
     mysql_query("insert into location_list (reservno, location) values ('$cc', '$line')") 
      or die(mysql_error()); //insert value of textarea then save it separately in location_list if \n is found 
    } 

如果I输入上的文本区域(假设我已经从保留表最大reservno '00014')以下的数据,

Davao - Cebu 
Cebu - Davao 

然后提交它,我会在我的location_list表有这些数据:

loc_id || reservno || location 
00001 || 00014 || Davao - Cebu 
00002 || 00014 || Cebu - Davao 

那么这个代码:

$gg=mysql_query("SELECT GROUP_CONCAT(IF((@var_ctr := @var_ctr + 1) = @cnt, 
          location, 
          SUBSTRING_INDEX(location,' - ', 1) 
          ) 
          ORDER BY loc_id ASC 
          SEPARATOR ' - ') AS locations 

    FROM location_list, 
     (SELECT @cnt := COUNT(1), @var_ctr := 0 
      FROM location_list 
      WHERE reservno='$cc' 
     ) dummy 
    WHERE reservno='$cc'") or die(mysql_error()); //QUERY IN QUESTION 
    $hh=mysql_fetch_array($gg); 
    $ii=$hh['locations']; 
    mysql_query("update reservation set itinerary = '$ii' where reservno = '$cc'") 
     or die(mysql_error()); 

应该与'Davao - Cebu - Davao'更新预约表,但它返回这个代替,'Davao - Cebu - Cebu'。我曾经在这个论坛上帮助过这个代码,但现在我面临着另一个困难。只是不能得到它的工作。请帮帮我。提前致谢!

+0

@Omesh,我将这段代码记入您的账户。 :))请继续帮助我完成这项工作。谢谢 – xjshiya

+0

雅,当然,你可以发布链接到你原来的问题:http://stackoverflow.com/questions/12171581/mysql-string-functions/12171808#comment16410367_12171808 – Omesh

+0

你真的需要开始正常化。你撕开一个字符串,只是为了重建它... –

回答

0

我得到它的工作(没有ORDER BY loc_id ASC)只要我设置phpMyAdmin操作loc_id升序。但是,每当我删除所有数据时,它会以loc_id降序返回,因此我必须重置它。它并没有完全解决问题,但我想这是尽可能的。 :))我只需要确保表列的loc_id总是按升序排列。谢谢你们每一个人的帮助!对此,我真的非常感激!但是如果你有更好的答案,比如如何设置表列总是按照升序排列或者更好的查询等,请随时在这里发布。愿上帝保佑你们!

0

允许数据库服务器重写您的查询以优化其执行。这可能会影响各个部分的顺序,特别是各个分配的执行顺序。我假设一些这样的重新编码导致查询的结果变得未定义,以这种方式它可以在sqlfiddle上运行,但不在实际的生产系统上运行。

我不能把手指放在事情出错的确切位置,但我相信问题的核心在于SQL的意图是处理关系,但是您会尝试将其用于顺序编程。 我建议你使用可移植的SQL从数据库中检索数据,而不使用任何变量hackery,然后使用PHP来执行任何可能需要的后处理。 PHP更适合表达你正在制定的想法,并且没有优化或重新排序的语句会在你的方式。而且,由于您的查询目前仅导致单个值,因此在PHP代码中提取多行并将其组合为单个值不应该增加太多复杂度。


编辑:

虽然discussinganother answer使用类似的技术(由Omesh为好,就像the answer你的代码是基于),我发现这个在MySQL manual

由于一般规则,您不应该为用户变量 分配值并读取同一语句中的值。您可能会得到您期望的 结果,但这不能保证。对涉及用户变量的表达式求值的次序为 未定义,并且 可能会根据给定语句中包含的元素进行更改; 另外,这个顺序不保证在MySQL服务器的 版本之间是一样的。

因此,对这些变量赋值进行评估的顺序没有任何保证,因此不能保证查询能够满足您的期望。它可能有效,但可能会突然失败。因此,我强烈建议您避免使用这种方法,除非您有一些中继机制来检查结果的有效性,或者真的不关心它们是否有效。