0

以下に示すように5つのクエリがあります。すべてに対してユニオンを実行する必要があります

  if($dv_state_ids!="")//check if no state is entered
    $state_sql="SELECT pkg_id FROM package_state where state_id in ($dv_state_ids)  ";
  if($dv_city_ids!="")//check if no city is entered
    $city_sql="SELECT pkg_id FROM package_city where  city_id in ($dv_city_ids)";
  if($dv_category_ids!="")//check if nocategory is entered
    $category_sql="SELECT pkg_id FROM package_category where category_id in ($dv_category_ids) ";
  if($dv_sub_category_ids!="")//check if no subcategory is found
    $sub_category_sql="SELECT pkg_id FROM package_category where subcategory_id in ($dv_sub_category_ids) ";
  if($dv_category_ids!="")
    $package_sql="SELECT pkg_id FROM package where id in ($dv_category_ids) ";

次のステートメントで上記のクエリでユニオンを実行できます

$sql_get_any_packages=$state_sql." union ".$city_sql." 
union 
".$category_sql." union ".$sub_category_sql." union ".$package_sql ;

ただし、いずれかのクエリが null の場合、mysql でエラーが発生します。1 つの方法は、i が 32 の条件をフレーム化することです (これは、さまざまな条件をチェックするために、これらの 5 つのクエリによって形成されます)。

誰かが私に別の方法を提案できますか

また、これら5つのクエリの結果に対して交差を実行する必要があり、SQLはINTERSECTをサポートしていません

これで私を助けてください

4

1 に答える 1

1

「クエリが null である」とは、PHP 変数が であることを意味しているようnullです。これは、SQL または SQL 共用体に固有のものではありません。

繰り返さifれる

だからあなたができることはこれです:

$sql_get_any_packages = "";
if (!is_null($state_sql))
 $sql_get_any_packages .= " union " . $state_sql;
if (!is_null($city_sql))
 $sql_get_any_packages .= " union " . $city_sql;
if (!is_null($category_sql))
 $sql_get_any_packages .= " union " . $category_sql;
if (!is_null($sub_category_sql))
 $sql_get_any_packages .= " union " . $sub_category_sql;
if (!is_null($package_sql))
 $sql_get_any_packages .= " union " . $package_sql;
$sql_get_any_packages = substr($sql_get_any_packages, strlen(" union "));

nullこれは、それぞれの先頭を含むすべての非部分を単純に収集し、最後" union "のイニシャルを削除し" union "ます。すべてのクエリがnull同時に行われる可能性がある場合、最終結果は になりますFALSE

配列の使用

別の方法として、パーツを配列にドロップし、 を使用して要素array_filterをドロップし、結果を接着剤として使用することもできます。対応するコードは次のようになります ( ideone の例も参照してください)。nullimplode" union "

$sql_get_any_packages = array(
    $state_sql,
    $city_sql,
    $category_sql,
    $sub_category_sql,
    $package_sql);
$sql_get_any_packages = array_filter($sql_get_any_packages);
$sql_get_any_packages = implode(" union ", $sql_get_any_packages);

交差について

結果を交差させたい場合は、それらの結合を無視したくありません。ユニオンを実行すると、個々のパーツにアクセスできなくなるため、それらを互いに比較することはできません。交差を実現するには、SQL で結合を使用します。完全な例は次のようになります。

SELECT package_state.pkg_id
FROM package_state, package_city, package_category, package_category, package
WHERE package_state.state_id IN ($dv_state_ids)
  AND package_city.city_id IN ($dv_city_ids)
  AND package_category.category_id IN ($dv_category_ids)
  AND package_category.subcategory_id IN ($dv_sub_category_ids)
  AND package.id in ($dv_category_ids)
  AND package_state.pkg_id == package_city.pkg_id
  AND package_state.pkg_id == package_category.pkg_id
  AND package_state.pkg_id == package.pkg_id

上記のようなソリューションを使用して、このようなクエリを作成できますが、少し複雑になります。特に、package_state上記のクエリのテーブルは、他のすべてのテーブルとは多少異なる役割を果たします。これはSELECT、出力値のテーブル形式であり、s also the table which occurs on the left hand side of all thepkg_id comparisons, where the other tables appear on the right hand side. So you might want to collect several arrays, one of table names and one offoo IN (bar)` 条件です。次に、テーブル名の配列の最初の要素を使用して、その特別な役割を果たすことができます。

SQLインジェクションに注意

ユーザー リクエストの文字列をクエリに貼り付ける場合は注意してください。それらには、データを破損する醜いものが含まれている可能性があります。入力が正常であることを確認してください。たとえば、整数値のコンマ区切りリストのみであることを確認してください。または、準備済みステートメントを使用すると、これらの問題のほとんどから切り離すことができます。

于 2012-11-30T17:33:41.060 に答える