【问题标题】:Why is my MySQL query returning a multidimensional array rather than a single-dimension array?为什么我的 MySQL 查询返回的是多维数组而不是单维数组?
【发布时间】:2012-10-06 18:59:16
【问题描述】:

这是我的查询:

SELECT DISTINCT ap.apptype_id
FROM tblSubmission AS s
JOIN tblApp AS ap ON ap.app_id = s.app_id
WHERE s.app_id =406
OR s.app_id =180
OR s.app_id =179

它只返回与数据库中的行相关的唯一 apptype_id。它现在就像它应该的那样工作,除了它返回一个多维数组而不是一维数组这一事实。我可以继续编写一个 PHP 函数来解决这个问题,但我宁愿让查询正确地返回数组,而不是让服务器做额外的工作来解决查询问题。谁能帮帮我?

另外,如果有人发现我可以优化此查询以使其更快,那也太好了!

function db_query($querystring) { 
   $rec_set = array(); 
   $result = mysql_query($querystring); 
   if (!$result) { 
       // do nothing, query might have failed but it might have just returned no results          
       #echo ("Invalid Query Result:<br /><b>" . $querystring . "</b><br />"); // debug 
    }elseif($result === true){ 
       // do nothing, query didn't return anything but succeeded 
    }else{ 
       while ($row = mysql_fetch_assoc($result)) { $rec_set[] = $row; }            
       mysql_free_result($result); 
    } 
    return $rec_set; 
  }

【问题讨论】:

  • 你是如何获取它的?如果从 mysql_query 调用,它应该返回一个资源。
  • 你能展示一个它返回的数组的例子吗,因为我认为这更多的是你用来查询数据库的函数,而不是查询本身。
  • SQL结果的解释,据我所知,依赖于php端。 php代码在哪里?
  • 这就是查询的工作方式。它将每个成功的选择作为一行返回,因此它将返回一个行数组,每行包含一个值数组。在这种情况下,数据只是一个值(id)。
  • 这是从查询返回的数组: Array ( [0] => Array ( [apptype_id] => 2 ) [1] => Array ( [apptype_id] => 7 ) )

标签: php mysql sql arrays web-applications


【解决方案1】:
SELECT DISTINCT ap.apptype_id
FROM tblSubmission AS s
JOIN tblApp AS ap ON ap.app_id = s.app_id

以上部分将选择所有不同的apptype_id,其中app_id 位于tblSubmissiontblApp 中。然后,如果 ID 是 406 OR 180 OR 179,那么您正在接受。因此它将返回所有apptype_id,其中对应的IDs 与这三个IDs 匹配并且在两个表中。

假设,

tblApp(id, type) 具有三个条目 &lt;406, 10&gt;&lt;180, 11&gt;&lt;100, 12&gt;tblSubmission(id, ...) 具有三个条目 &lt;406, ...&gt;&lt;180, ...&gt;&lt;179, ...&gt;。 加入table(id, type, ...)后会有两个条目 &lt;406, 10, ...&gt;&lt;180, 11, ...&gt; 想想如果你选择不同的类型会发生什么?它将返回两个条目 &lt;10&gt;&lt;11&gt;

【讨论】:

    【解决方案2】:

    您要返回两条记录,因此它是多维的。

    您有 DISTINCT ap.apptype_id 并且您的查询找到了两条具有不同 ID 的记录。

    编辑:只是为了澄清;在您寻找的一维数组中,我相信您想要的结果是:

    array([7], [2]) // i.e your two distinct ids.
    

    请记住,使用 mysql 时也会返回列标题,因此这种布局没有意义。

    编辑 2:

    也许这样的事情会有所帮助?

    $a = array(
        0 => array('first'=>7),
        1 => array('second'=>2)
    );
    
    $row = array_map('implode', $a);
    

    输出:

    array(2) { [0]=> string(1) "7" [1]=> string(1) "2" }
    

    array_map 是您想要的函数。它应该可以根据您的需要工作。

    【讨论】:

    • 啊,我不知道列标题也会被返回。是的,array([7], [2]) 是我想要得到的。我认为没有办法剥离列标题?
    • 编辑:移至主要答案。
    【解决方案3】:

    它正在返回多维数组,因为您用mysql_fetch_assoc($result) 要求它

    如果您将代码移至 PDO 之类的内容,您可以使用 fetch 列来获取您想要的内容。 http://www.php.net/manual/en/pdostatement.fetchcolumn.php

    关于您的原始问题,查询很好,您从 PHP 获取它的方式是导致问题的原因。至于让它更快,你可能会考虑使用IN而不是多个ORs,但我不确定这是否会对mysql有任何影响(你可以在查询中使用EXPLAIN来显示数据库正在使用什么得到结果)

    【讨论】:

    • 感谢您的回答。不幸的是,我目前无法切换到 PDO(可能在明年重新编写应用程序时)。我将只使用 PHP 将数组展平。再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 2018-06-01
    • 2015-05-01
    • 2020-06-01
    • 2020-06-20
    • 2017-06-14
    • 1970-01-01
    相关资源
    最近更新 更多