GROUP BY不工作?

时间:2017-09-22 17:08:05

标签: php mysql mysqli

我的数据库

CREATE TABLE `mytable` (
  `id` smallint(4) UNSIGNED NOT NULL,
  `name` char(30) NOT NULL,
  `country` char(30) NOT NULL
)
ENGINE=MyISAM DEFAULT CHARSET=utf8;

我的数据

id   | name              | country
-----|-------------------|--------
1    | Tom Hanks         | Usa
2    | Monica Bellucci   | Italy
3    | Takeshi Kitano    | Japan
4    | Javier Bardem     | Spain
5    | Jim Carrey        | Canada
6    | Luc Besson        | France
7    | Leonardo DiCaprio | Usa
8    | Pedro Almodovar   | Spain
9    | Ryan Gosling      | Canada
10   | Terence Hill      | Italy
11   | Jean Reno         | France
12   | Roland Emmerich   | Germany
13   | Mamoru Hosoda     | Japan
14   | James Cameron     | Canada
15   | Tom Cruise        | Usa
16   | Penélope Cruz     | Spain
17   | Sergio Leone      | Italy
18   | Claude Lelouch    | France
19   | Max Riemelt       | Germany
20   | Hiroyuki Sanada   | Japan

我有一个搜索输入文本(用于输入国家/地区名称),我在下拉列表中显示数据库中的现有国家

我的查询发送一个关键字并返回我的国家/地区(带有ID),它运行正常,但它显示有重复的国家

<?php
require_once '../config/dbconnect.php';
if(!empty($_POST["keyword"])) {
    $result = $conn->query("SELECT id, country FROM mytable WHERE country LIKE '%".$_POST["keyword"]."%' ORDER BY country LIMIT 10");
    $rowCount = $result->num_rows;
    if($rowCount > 0){
        while($row = $result->fetch_assoc()){
            echo '<option value='.$row["id"].'>'.$row["country"].'</option>';
        }
    }
}
?>

问题在于我必须显示没有重复的国家/地区,只有不同的值,而且我找不到解决方案,

我使用了GROUP BY条款,但它不起作用,下拉列表保持空白,我不知道如何解决问题

<?php
require_once '../config/dbconnect.php';
if(!empty($_POST["keyword"])) {
    $result = $conn->query("SELECT id, country FROM mytable WHERE country LIKE '%".$_POST["keyword"]."%' GROUP BY country");
    $rowCount = $result->num_rows;
    if($rowCount > 0){
        while($row = $result->fetch_assoc()){
            echo '<option value='.$row["id"].'>'.$row["country"].'</option>';
        }
    }
}
?>

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

只是精确度

我不能使用SELECT DISTINCT country FROM mytable,因为我还需要存储在选项值中的id

id用于另一个查询(当我点击dropodown列表时)以显示与所选国家/地区对应的名称

答案 1 :(得分:0)

您遇到数据库设计问题。您将名称和国家/地区混合在一个表中。因此表中的ID引用了它们。

您有两种选择:

  • 简单但更糟糕的选项:使用SELECT DISTINCT country FROM mytable并更新您的其他查询(当您点击下拉列表时)。您可以通过此查询显示与国家/地区相对应的名称:SELECT name FROM mytable where country ='".$country."'
  • 更难但更好:通过Second Normal Form更新数据库架构(为国家/地区创建新表并更新mytable中的条目。)

    您可以使用此脚本:

    CREATE TABLE `countries` (
      `id` int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
      `name` char(30) NOT NULL
    );
    
    INSERT INTO countries (name) SELECT DISTINCT country as name FROM mytable;
    
    ALTER TABLE `mytable`
    ADD `country_id` int(10) unsigned NOT NULL,
    ADD FOREIGN KEY (`country_id`) REFERENCES `countries` (`id`);
    
    UPDATE mytable SET country_id = (SELECT id FROM countries WHERE name = country);
    
    ALTER TABLE `mytable` DROP `country`;
    

    之后您可以显示国家/地区:

    <?php
    require_once '../config/dbconnect.php';
    if(!empty($_POST["keyword"])) {
        $result = $conn->query("SELECT id, name FROM countries WHERE name LIKE '%".$_POST["keyword"]."%' ORDER BY name LIMIT 10");
        $rowCount = $result->num_rows;
        if($rowCount > 0){
            while($row = $result->fetch_assoc()){
                echo '<option value='.$row["id"].'>'.$row["name"].'</option>';
            }
        }
    }
    ?>
    

    请勿忘记更新您的其他查询以按country_id过滤:

    SELECT name FROM mytable where country_id ='".$countryId."'