2016-06-26 3 views
0

私は、製品namesを保持するテーブルを持っているdescriptionpricesなど、別のテーブルは、管理者は最初のテーブルを展開するカスタム列を追加することができましたがあります。これらの列は、PHPフォームを通じて作成されます。私はどのくらい多くのユーザーが作成されるのかわからない。mysqlの選択2つのテーブルからのデータが、第二の表では、ダイナミックセル名

id 
name  
description 
price 
created 

を第二のテーブル"products_customは"があります:

例えば

"製品"のテーブルがあり

id 
product_id //this value holds the product id from the above table 
serial_number //a custom column the user created 
product_image //another column the user created 

さて、これらのすべての値を表示するために、テーブルは、products.idproducts_custom.product_idに基づいて2つのテーブルをLEFT JOINする必要があります。

適切なSQLクエリは次のようになります。

SELECT p.*, pc.serial_number, pc.product_image FROM products AS p 
LEFT JOIN products_custom as pc ON p.id = pc.product_id ORDER BY p.id ASC 

私はそうでそれらを使用するためにこれらの値を持つ第二のテーブルを照会するPHPの関数を使用してproducts_customテーブルに存在するセル名を取得することができます上記のクエリは問題ではありません。これらの列名を変数に戻すことができます。

(example: $mycolumns = "serial_number,product_image") 

この問題は、ここでもうまくいきます。

SELECT p.*, serial_number,product_image FROM products AS p 
LEFT JOIN products_custom ON p.id = products_custom.product_id ORDER BY p.id ASC 

これは機能しますか?私はそれのように残すことができますか?または私はPCを追加する必要があります。プレフィックスはすべて$mycolumnsの値を持っていますし、上記の「適切なクエリ」のように見えるようにsqlを再構築しますか?

ありがとうございます!

FINAL EDIT:回答に基づいて は、列名の文字列からpc.prefixを含めるようにSQLを変換するために、怒鳴る:

//$whatCol = "serial_number,product_image"; 
$choices = explode(",", $whatCol); 
foreach($choices as &$choice) { 
    $choice = "pc.".mysql_real_escape_string($choice); 
} 
$whatColSQL = implode(",", $choices); 

$prSQL = "SELECT p.*, $whatColSQL FROM products AS p LEFT JOIN products_custom as pc ON p.id = pc.product_id ORDER BY p.id ASC"; 
+0

私は問題を理解していないと告白します – Strawberry

+0

私の悪い、私は私の質問で徹底したかった...事を簡素化する... 私が書いた '適切なSQL'クエリはPCを使用しています。 2番目のテーブルの 'name'の接頭辞。 しかし、最後のSQLでは書いたが、私は気づかずにpcを使わずに列名を書くことに気づいた。また動作します...それは奇妙です...それはまた、それらの列のためにも最初のテーブルを検索する必要がありますか?なぜSQLクエリが機能しているのですか?それをそのまま残すことができますか? – user1033882

+1

これらの列が両方のテーブルに存在すると、あいまいさが発生し、クエリが失敗します。だから、テーブル名/テーブルエイリアスにカラム名を含める方が良いでしょう。 – Strawberry

答えて

0

はい、あなたはpc.表の別名を使用する必要があります。

理由がの場合の理由は、これらの列名が照会された表に固有であるためです。私はあなたがpc.エイリアスを使用する必要があると言う

理由は、ユーザーがproductsテーブルでもある(products_custom中)カスタム列名を作成することができ、問題を防ぐためです。たとえば、descriptionまたはpriceです。 pc.エイリアスがなければ、重複するカラム名はSQL Error 1052 Ambiguousを投げるべきです。

編集:Drewのコメントに基づいていくつかの詳細が含まれ、変更されました。

+0

それは私が思っていたことです...それは正常な運でした:) – user1033882

+1

重複したカラム名を持つカラムリストをselectステートメントが生成すると、テーブルエイリアスなしでそれらを参照しようとしない限りエラーは発生しませんあなたはそれを呼び出す)。その場合、エラーは 'Error 1052 Ambiguous ... 'です。 – Drew

+0

@Drew Thanks。あなたの情報を含めるように答えを更新しました。 – Tigger

関連する問題