2016-06-16 11 views
0

私はいくつかのコードを最適化しようとしていますが、これを行うにはif/elseまたはcaseが必要だと思っていますが、私はそれを動作させるためにPHPを必要としています。PHPをSQLのケースで使用できますか?

ここはコードです

$sql = "SELECT value, COUNT(*) AS count 
    FROM sodsurvey LEFT OUTER JOIN age 
    ON sodsurvey.age_id = age.id 
    WHERE value IS NOT NULL AND office_id = " . $office_id . " 
    GROUP BY age_id; "; 

if ($_SESSION['filteryear'] != 0 && $_SESSION['filtermonth'] != 0) { 
    $sql = "SELECT value, COUNT(*) AS count 
    FROM sodsurvey LEFT OUTER JOIN age 
    ON sodsurvey.age_id = age.id 
    WHERE value IS NOT NULL AND office_id = " . $office_id . " 
    AND year = " . $_SESSION['filteryear'] . " AND month = " . $_SESSION['filtermonth'] . " 
    GROUP BY age_id; "; 
} else if ($_SESSION['filteryear'] != 0 || $_SESSION['filtermonth'] != 0) { 
    $sql = "SELECT value, COUNT(*) AS count 
    FROM sodsurvey LEFT OUTER JOIN age 
    ON sodsurvey.age_id = age.id 
    WHERE value IS NOT NULL AND office_id = " . $office_id . " 
    AND (year = " . $_SESSION['filteryear'] . " OR month = " . $_SESSION['filtermonth'] . ") 
    GROUP BY age_id; "; 
} 

を最適化しようと、これは私があなたに私が

$filter = ""; 

if ($_SESSION['filteryear'] != 0 && $_SESSION['filtermonth'] != 0) { 
    $filter = "AND year = " . $_SESSION['filteryear'] . " AND month = " . $_SESSION['filtermonth'] . "" 
} else if ($_SESSION['filteryear'] != 0 || $_SESSION['filtermonth'] != 0) { 
    $filter = "AND (year = " . $_SESSION['filteryear'] . " OR month = " . $_SESSION['filtermonth'] . ")" 
} 

$sql = "SELECT value, COUNT(*) AS count 
FROM sodsurvey LEFT OUTER JOIN age 
ON sodsurvey.age_id = age.id 
WHERE value IS NOT NULL AND office_id = " . $office_id . " 
CASE 
    WHEN ".isset($filter)." THEN ". $filter ." 
END 
GROUP BY age_id; "; 
+0

あなたの質問は何ですか?また、準備されたステートメントについて考える必要があります。 – take

+0

上記の試みでPHPを使用することは有効ですか? – Sai

+0

PHPの 'CASE'(MySQLの' switch')や 'CASE'について質問していますか? – Jocelyn

答えて

1

どの値(年、月など)が設定されているかによってフィルタの配列を構築し、それらをすべてWHERE句に結合することができます。両方が設定されているか、設定されているかなど、別々のケースすべてについて心配する必要はありません。

上記のアドバイスを参考にして、準備されたステートメントを調べることを強く推奨しますが、うまくいけばあなたを手に入れます。

<?php 
$office_id = 10; 
$_SESSION['filteryear'] = 2016; 
$_SESSION['filtermonth'] = 12; 

$filters = [ 
    "value IS NOT NULL", 
    "office_id = {$office_id}", 
]; 

if ($_SESSION['filteryear']) { 
    $filters[] = "year = {$_SESSION['filteryear']}"; 
} 

if ($_SESSION['filtermonth']) { 
    $filters[] = "month = {$_SESSION['filtermonth']}"; 
} 


$sql = " 
    SELECT value, COUNT(*) AS count 
    FROM sodsurvey 
    LEFT JOIN age ON sodsurvey.age_id = age.id 
    WHERE " . implode(' AND ', $filters) . " 
    GROUP BY age_id; 
"; 

implodeラインは、単一のWHERE句内に設定されていた各フィルタを組み合わせます。

+0

これは動作します、ありがとう、私は理解しようとしていますが、両方の条件が真であれば、最終的なSQL結果はこのようなものになります(「SELECT値、COUNT(*)」カウント) FROM sodsurvey LEFT OUTER JOIN年齢 ON sodsurvey.age_id = age.id WHERE値がNULLではなく、office_id = 10 年= 2016 月= 12 GROUP BY age_id; ")? – Sai

+0

両方とも設定されている場合、SQLには両方の条件が含まれます。 1つだけが設定されている場合、その1つだけが使用されます。 – iainn

+0

ありがとう、私は今理解しています – Sai

1

それが有効な場合にPHPを使用することです達成しようとしています何の大まかなアイデアを与えることを試みたものであるのです上記の私の試み?番号のPHPコードは、しかし、あなたのPHPコードは、私は私のコード

を最適化する方法を見つけようとしています、MySQLでは SQLクエリ

生成することができ、あなたのSQLクエリの一部にすることはできません

すべての条件に基づいてPHPコードでSQLコードを生成するだけです。条件付きでクエリの一部である文字列を簡単に連結することができます。

関連する問題