2017-09-22 9 views
-2

私のデータベースGROUP?

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を使用しますが、それは動作しません

問題は、私は、重複せずに異なる値のみを国を表示しなければならないということである、と私は解決策が見つからない、

、ドロップダウンリストには、空白のまま私はどのようにして問題を解決できるのか分かりません

ありがとうございました!

+0

あなたは既に**有界変数入力して、あなたは[SQLインジェクション]と照らし合わせてデータベースを保護するために、プレースホルダ(準備文)とのパラメータ化クエリを使用する必要があります**プリペアドステートメントをサポートしてAPIを使用しています( http://stackoverflow.com/q/60174/)! ['mysqli :: prepare()'](http://php.net/mysqli.prepare)と['mysqli_stmt :: bind_param()'](http://php.net/mysqli-stmt)から始めましょう。 .bind-param)。 – Qirel

+1

事はある、あなたのテーブルのidは人ではなく、国を指します。おそらく 'SELECT DISTINCT国FROM mytable'を使い、それを値と表示されたテキストの両方に使用したいだけです。 –

+0

これはデータベース設計の問題のようです。明らかに 'name'か' country'のどちらかがプライマリキーの属性ではありません。 – bassxzero

答えて

0

だけ精度

私はまた私がクリックしたときに

idは(別のクエリで使用されているオプション値に格納されたIDを必要とするので、mytableはは異なる国を選択して使用することはできません

国に対応した名前を表示するdropodownリスト)は、データベースの設計に問題がある

0

を選択しました。 1つのテーブルに名前と国を混在させています。だから、テーブルのIDは両方のものを参照しています。

  • 簡単ですが、悪い方のオプション:SELECT DISTINCT country FROM mytableを使用して(あなたがドロップダウンリストをクリックしたときに)あなたの別のクエリを更新

    2つのオプションがあります。 SELECT name FROM mytable where country ='".$country."':あなたはこのクエリによって国に対応した名前を表示することができます。

  • ハーダーが、より良い:(。mytableは中国および更新エントリの新しいテーブルを作成します)あなたのDBスキーマがSecond Normal Formにより更新

    このスクリプトを使用することができます:あなたは国を表示することができた後

    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."' 
    
+0

おはようございますJ. Ancinec! はい私はそれを更新しました、ありがとうございました! – zanzibar

+0

素敵な一日を! – zanzibar