2016-08-07 13 views
-1

私の1から多くのPHPクエリを正しく実行する方法を理解する上で問題があります。1対多のPHPクエリ

は現在、私は、MySQLデータベースで2つのテーブルを持っている

  • DELI_ITEMS [Ingredient_Type、itemNameに]
  • DELI_ITEMS_QUANTITY [Ingredient_Type、数量]

私が持っているこのようなMYSQLクエリ:

$sql_deli_meat="SELECT * FROM deli_items,deli_items_quantity WHERE ingredient_type = 'deli_meat' ORDER BY sort ASC"; 

PHPクエリ

<?php while($rows=mysql_fetch_array($result_deli_meat)){ ?> 

     <input type="checkbox" name="deli_meat[]" id="<? echo $rows['itemname']; ?>" value="<? echo $rows['label']; ?>"/> 

     <select name="deli_meat[]"> 
     <option value="<? echo $rows['qty']; ?>"><? echo $rows['qty']; ?></option> 
     </select> 


    <?php } ?> 

私は、各チェックボックスの入力を取得しようとしているが、選択ボックスでDELI_ITEMS_QUANTITYから数量項目を表示するにはDELI_ITEMSから返されました。どちらが共通のフィールドがと呼ばれている「Ingredient_Type」

は、どのように私は私のMYSQLのクエリがこれを表示するためにtweekことができますか?

私の最初のアイデアは、以下のような何かをすることでしたが、私はあなたがmysqlは加入誤解だと思う

$sql_deli_meat="SELECT * FROM deli_items JOIN deli_items_quantity ON deli_items.ingredient_type=deli_items_quantity.ingredient_type WHERE enabled = 1 AND deli_items.ingredient_type = 'deli_meat' ORDER BY sort ASC"; 
+0

mysql_ * '関数は非推奨です –

+0

2つのテーブルを結合する必要がありますので、現在のステートメントは確実に機能しません。また、テーブルの別名を使用してクエリを読みやすくしてください。 – csabinho

答えて

2

を動作しませんでした。

構文は次のとおりです。

**SELECT** {YOUR COLUMNS LISTED WITH ,} **FROM** {YOUR BASE TABLE (the ONE in your one to many) **INNER JOIN** {YOUR OTHER TABLE} **ON** {BASETABLENAME.column = OTHERTABLE.column} 

だからあなたの例では、あなたが任意の主キーと外部キーを持っていないようです。実際にいくつか作成して、全体の例をより良くすることができます。

DELI_ITEMS [id, item_name] 

INGREDIENTS [id, name] 

DELI_ITEMS_INGREDIENTS [deli_item_id, ingredients_id, quantity] 

これで正規化が完了しました。アイテムと成分のベースリストはセパレートリストにあり、アイテムに成分を選択できるリンクテーブルがあります。数量はリンクテーブルに格納されます。

選択するSQLを見てみましょう。

SELECT di.name 'item', i.name 'ingredient', dii.quantity 
FROM deli_items di 
INNER JOIN deli_items_ingredients dii ON di.id= dii.deli_item_id 
INNER JOIN ingredients i ON i.id = dii.ingredients_id 

これは、あなたのようにすべてのデリアイテムや食材のリストを提供します:上記を説明するために

アイテム、成分、量

を、テーブル名の後の文字はにエイリアスされていますクエリを読みやすくします。 INNER JOINは結果を示すために各テーブルにレコードを持たなければならないことを意味します。 ONステートメントは、SQLに結合する列の識別を指示します。 select行の引用符は、この例では2つのテーブルが "name"を使用するようにするための列のエイリアスです。

これで、1つのテーブルのみを更新するだけで、データを管理しやすくなりました。

-

は、このオンライン上のチュートリアルがたくさんありますし、これは非常に基本的な例です。私は、Googleを停止し、いくつかのSQLテーブル、正規化とクエリについてyoutubeを読んでお勧めします。

"PDO"と "PARAMETRISED QUERIES"を確認して、受け入れるユーザーがクエリを「SQL INJECTION」に入力すると、それ以上先に進むことになります。

0

SELECT * 
    FROM deli_items AS i 
    JOIN deli_items_quantity AS q ON i.ingredient_type=q.ingredient_type 
    WHERE enabled = 1 AND i.ingredient_type = 'deli_meat' 
    ORDER BY i.ingredient_type ASC 

このクエリを試してみてくださいとにかく、あなたはあなたのもいいだろう= 1 ...

を有効ように使用している列を指定いけないどのようにテーブルが見て、原因それほど明確ではありませんMySql Workbenchでクエリdirecrlyをテストするか、PHPが取得しているものをダンプしてください。