首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP mysql选择数组并检查值是否存在

PHP mysql选择数组并检查值是否存在
EN

Stack Overflow用户
提问于 2014-01-27 13:55:40
回答 3查看 2.3K关注 0票数 2

我有一张MySQL表:

其中我想得到每个平台的计数(windows,linux,mac,未知)。

注意,表中没有macunknown数据,num中的num将是0

条件:

  • 订单必须与想要的输出一样
  • 检查plaform是否在表中,如果没有将零添加到输出中

问题:如何在查询中排序以获得类似于所需输出的顺序,如果表中没有平台,则添加零?

想要输出:

代码语言:javascript
复制
array (
    '0' => array('name' => 'windows', 'num' => 3),
    '1' => array('name' => 'linux', 'num' => 3),
    '2' => array('name' => 'mac', 'num' => 0),
    '3' => array('name' => 'unknown', 'num' => 0)
);

我的尝试:

PHP:

代码语言:javascript
复制
function get_platforms() {
    $query = "
            SELECT platform, COUNT(platform) AS num 
            FROM stats 
            GROUP BY platform 
            ORDER BY platform ASC
            ";
    $select = mysqli_query($this->c, $query);
    while ($row = mysqli_fetch_array($select)) {
        $data[] = array(
            'name' => $row['platform'],
            'num' => $row['num']
        );
    }
    return $data;
}

电流输出:

代码语言:javascript
复制
array (
    '0' => array ('name' => 'linux', 'num' => 3)
    '1' => array ('name' => 'windows', 'num' => 3)
);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-27 14:02:49

因为您的数据库中没有任何mac或未知数据,所以您将无法获得该平台的任何结果,甚至0。您可以做的是使用您期望得到的平台拥有一个预先配置的数组:

代码语言:javascript
复制
$data = array(
   'windows' => 0, 
   'linux' => 0,
   'mac' => 0,
   'unknown' => 0
)

现在,在您的get_platforms函数中执行以下操作:

代码语言:javascript
复制
function get_platforms() {
    $query = "
            SELECT platform, COUNT(platform) AS num 
            FROM stats 
            GROUP BY platform 
            ORDER BY platform ASC
            ";
    $select = mysqli_query($this->c, $query);
    while ($row = mysqli_fetch_array($select)) {
        $data[$row['platform']] = $row['num'];
    }
    return $data;
}

你最终会得到这样的结果:

代码语言:javascript
复制
$data = array(
   'windows' => 3, 
   'linux' => 3,
   'mac' => 0,
   'unknown' => 0
)

然后你可以用你想要的方式重新格式化数据。例如,您可以这样做:

代码语言:javascript
复制
$result = array();
foreach($data as $platform => $count){
    $result[] = array('name' => $platform, 'count' => $count);
}

结果将以您所要求的相同格式结束。

票数 4
EN

Stack Overflow用户

发布于 2014-01-27 14:04:07

首先,您应该定义一个期望输出的顺序,假设您有数组。

代码语言:javascript
复制
$osList = array('linux', 'windows', 'mac', 'something');

现在将mysql结果获取到临时assoc数组:

代码语言:javascript
复制
$data = array();
$query = "SELECT platform, COUNT(platform) AS num"
    . " FROM stats"
    . " GROUP BY platform";
$result = mysqli_query($this->c, $query);
while ($row = mysqli_fetch_array($result)) {
    $data[$row['platform']] = (int) $row['num'];        
}

在这里,可以形成输出数组:

代码语言:javascript
复制
$output = array();
foreach ($osList as $os) {
    $output[] = array(
        'name' => $os,
        'count' => isset($data[$os]) ? $data[$os] : 0
    );
}
票数 2
EN

Stack Overflow用户

发布于 2014-01-27 14:05:46

您必须有另一个表,其中列出了所有的平台。例如,我们将其命名为platforms,它有一个列platform_name,其中包含所有平台的唯一名称(包括mac),然后查询如下:

代码语言:javascript
复制
SELECT platforms.`platform_name`, COUNT(stats.`platform`) FROM `platforms`
LEFT JOIN `stats` ON  platforms.`platform_name` = stats.`platform`
GROUP BY platforms.`platform_name`
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21382691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档