你可以使用PHP与SQL案例?

时间:2016-06-16 10:11:37

标签: php mysql sql if-statement case

我正在尝试优化我的一些代码,我相信我需要一个if / else或case来做到这一点,但是我想我会在查询中需要php才能让它工作

这是我正在尝试优化的代码

    $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; ";

2 个答案:

答案 0 :(得分:1)

  

在上面的尝试中使用PHP和案例是否有效?

没有。 PHP代码不能成为SQL查询的一部分,但是您的PHP代码可以生成 SQL查询

  

在MySQL中,我试图找到一种优化代码的方法

根据所有条件,只需使用PHP代码生成SQL代码。您可以轻松地有条件地连接字符串作为查询的一部分。

答案 1 :(得分: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子句。