【问题标题】:MySQL order by problemsMySQL按问题排序
【发布时间】:2012-09-03 07:40:58
【问题描述】:

我有以下代码..

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
    }

如果我在 textarea 上输入以下数据(假设我从预订表中获得了最大的 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'。我以前在这个论坛的帮助下让这段代码正常工作,但现在我面临另一个困难。只是无法让它工作。请帮我。提前致谢!

【问题讨论】:

  • @Omesh,我将此代码归功于您。 :)) 请继续帮助我完成这项工作。谢谢
  • 是的,您可以发布原始问题的链接:stackoverflow.com/questions/12171581/mysql-string-functions/…
  • 你真的需要开始规范化。你正在撕开一根绳子,只是为了再次重建它......
  • @MarcB,是的,我会在解决这个问题后这样做。一次一个问题。我不是那个天才。 :))) 不过感谢您的建议。 :)))
  • loc_id 的数据类型是什么?应该是INT。你能发布你的Mysql版本吗?

标签: mysql sql-order-by


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    我无法确定出错的确切位置,但我认为问题的核心在于 SQL 旨在处理关系,但您却试图滥用它进行顺序编程。 我建议您使用可移植的 SQL 从数据库中检索数据,而无需任何变量骇客,然后使用 PHP 执行您可能需要的任何后处理。 PHP 更适合表达您的想法公式化,并且不会对语句进行优化或重新排序。由于您的查询目前只产生一个值,因此在 PHP 代码中获取多行并将它们组合成一个值不会增加太多复杂性。


    编辑:

    虽然discussing another answer 使用了类似的技术(Omesh 也是如此,正如您的代码所基于的the answer),但我在MySQL manual 中发现了这一点:

    作为一般规则,您永远不应该为用户变量赋值 并读取同一语句中的值。你可能会得到 您期望的结果,但这不能保证。的顺序 涉及用户变量的表达式的评估是未定义的,并且 可能会根据给定语句中包含的元素而更改; 另外,这个顺序不保证在 MySQL 服务器的版本。

    因此,无法保证这些变量赋值的评估顺序,因此无法保证查询符合您的预期。它可能会起作用,但它可能会突然而意外地失败。因此我强烈建议你避免这种方法,除非你有一些可靠的机制来检查结果的有效性,或者真的不关心它们是否有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      • 2014-07-03
      • 2010-09-16
      • 2022-01-19
      相关资源
      最近更新 更多