这是我的查询:
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_ids。它现在像它应该的那样工作,除了它返回一个多维数组,而不是一个一维数组。我可以继续编写一个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;
}
您返回两条记录,因此它是多维的。
您有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是您想要的功能。它应该根据需要工作。
SELECT DISTINCT ap.apptype_id
FROM tblSubmission AS s
JOIN tblApp AS ap ON ap.app_id = s.app_id
上面的部分将选择app_id
在tblSubmission
和tblApp
中的所有不同apptype_id
。然后你正在采取如果ID是406 OR 180 OR 179
.因此,它将返回所有apptype_id
,其中相应的ID
与这三个ID
匹配,并且都在两个表中。
假设
tblApp(id, type)
有三个条目<406, 10>
、<180, 11>
和<100, 12>
。 tblSubmission(id, ...)
有三个条目<406, ...>
、<180, ...>
和<179, ...>
。加入后table(id, type, ...)
将有两个条目 <406, 10, ...>
和<180, 11, ...>
试想一下,如果您选择不同的类型会发生什么?它将返回两个条目 <10>
和<11>
它返回多维数组,因为您要求它使用mysql_fetch_assoc($result)
如果你把你的代码移动到PDO这样的东西,你可以使用fetch列来获取你想要的东西。 http://www.php.net/manual/en/pdostatement.fetchcolumn.php
关于您的原始问题,查询很好,您从 PHP 获取它的方式是导致问题的原因。 至于让它更快,你可能会考虑使用 IN
而不是多重ORs
但我不确定这是否会对 mysql 有任何影响(你可以在查询上使用 EXPLAIN 来显示数据库正在使用什么来获取结果)