如何在不重复php的值的情况下显示mysql数据库中的值

时间:2014-10-31 01:05:17

标签: php mysql

当Iam从表中显示数据库值时,它只是根据内容重复它们。第一张表是内容。

 id | category_id  |  name
-----------------------------
 1  |     2        |  Jason
 2  |     1        |  Richard
 3  |     2        |  John

类别表: -

 id | name
 ---------
  1 | Manager
  2 | Employee

我使用查询:

$query=mysql_query("SELECT * FROM content");
while($row=mysql_fetch_array($query)){
                 $data[] = array('id'=> $row['id'],
                                'category_id' => $row['category_id'], 
                                'name' => $row['name']
                           );
            }
  for($i=0;$i<count($data);$i++){
     echo $data[$i]['category_id'];
     echo $data[$i]['name']."<br/>";
  }

  OUTPUT:-
  2 Jason 
  2 John
  1 Richard

但我想要的是: -

 OUTPUT:-
 2 Jason John
 1 Richard

现在当回显结果时,它显示category_id 2次,其category_id = 2及其2个名称,但我想要的是仅显示category_id 1次,并且其对应的2名称category_id = 2。请帮忙。

5 个答案:

答案 0 :(得分:2)

尝试这种方法,它对我有用:

$query = mysql_query("SELECT COUNT(*), category_id, name, 

 GROUP_CONCAT(name separator ' ') as name FROM content  
 WHERE category_id=1 OR category_id=2 GROUP BY category_id 
 ORDER BY category_id DESC");

    while($row=mysql_fetch_array($query)){

        echo $row['category_id'] . " " . $row['name'] . "<br>";

    }

另外,只是关于mysql_*函数被弃用的快速说明。

使用mysqli with prepared statementsPDO with prepared statements它们更安全。

答案 1 :(得分:1)

使用此查询:

SELECT id, category_id, GROUP_CONCAT(name SEPARATOR ' ') AS name
FROM content
GROUP BY category_id

请参阅此处,了解有关如何使用GROUP BY和GROUP_CONCAT的快速教程:
w3schools.com / GROUP BY
mysqltutorial.org / GROUP_CONCAT

答案 2 :(得分:1)

您不应该使用mysql因为它已被弃用,所以为了帮助您我已经使用PDO完成此操作,以表明它并不像您想象的那样令人生畏。< / p>

PDO与数据库的连接:

try{
    $db = new PDO ('mysql:host=YourHost;dbname=YourDatabaseName', 'YourDatabaseUserName', 'YourDatabasePassword');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
    echo $e->getMessage();
    die();
}

上述连接使用了try catch,通过使用getMessage()函数删除大量不需要的信息,使任何错误更清晰,更容易阅读

您在PDO中的查询:

$sql = "SELECT GROUP_CONCAT(name SEPARATOR ' ') AS names FROM yourtable GROUP BY category_id";
$query = $db->query($sql);
$results = $query->fetchAll(PDO::FETCH_OBJ);

foreach($results as $result){
    echo "<pre>", ($result->names), "</pre>";
}

这是使用PDO查询数据库的最基本方法,但是如果你开始像这样使用它,你会发现更容易开发更深入,更安全的数据输入和获取数据的方法超出数据库,有助于防止SQL注入。

希望这是一个值得思考的东西,有助于您转向更安全的API。

答案 3 :(得分:0)

试试这个

select DISTINCT(*) from content 或者您可以更具体地使用ie DISTINCT(columnname)

答案 4 :(得分:0)

<?php

// Using MySQL GROUP_CONCAT

$sql = 'SELECT category_id, GROUP_CONCAT(name separator \' \') FROM content GROUP BY category_id';


// Or PHP reduce as below
// Dummy Records
$records = [
    ['id' => 1, 'category_id' => 2, 'name' => 'Jason'],
    ['id' => 2, 'category_id' => 1, 'name' => 'Richard'],
    ['id' => 3, 'category_id' => 2, 'name' => 'John']
];

$result = array_reduce($records, function($carry, $record) {
    if (!array_key_exists($record['category_id'], $carry)) {
        $carry[$record['category_id']] = [];
    }

    $carry[$record['category_id']][] = $record['name'];

    return $carry;
}, []);

foreach ($result as $categoryId => $names) {
    echo $categoryId . ' ' . implode(' ', $names) . "\n";
}