更清洁的方式来编写这个MySql查询

时间:2014-03-12 17:14:23

标签: php mysql sql

我通过php生成以下查询

$sql .= "Select * from test";

$sub_sql = '';

foreach($value as $n_k => $n_v)
{
    switch($n_v)
    {
        case '1':
            $sub_sql .= " OR (id = 1 )"; 
        break;
        case '2':
            $sub_sql .= " OR (category = 4) ";
        break;
        case '3':
            $sub_sql .= " OR (location = 'U.S.') ";
        break;  
    }
}

if($sub_sql != '')
{
    $sql .= " where ( 0 ".$sub_sql." ) ";
}

$sql .= "GROUP BY id  ORDER BY stored_date DESC LIMIT 0, 5 ";

但是,由于您可以看到$subsql$sql连接的位置,因此该部分看起来非常混乱。虽然它工作正常,但它看起来很糟糕。任何人都可以帮我这个吗?

2 个答案:

答案 0 :(得分:0)

这是一个简化的例子吗?因为我认为没有理由不这样简化:

$sql .= "Select * from test where a=1";

foreach($value as $n_k => $n_v)
{
    switch($n_v)
    {
        case '1':
            $sql .= " AND (id = 1 )"; 
        break;
        case '2':
            $sql .= " AND (category = 4)";
        break;
        case '3':
            $sql .= " AND (location = 'U.S.')";
        break;  
    }
}

$sql .= " ORDER BY stored_date DESC LIMIT 0, 5 ";

请注意,我从您的对帐单中删除了GROUP BY。如果您不使用聚合函数,则不应该使用它。分组折叠行组并显示每个组中的随机行。如果您需要删除重复的行,请考虑在DISTINCT子句中使用SELECT关键字。

<强>更新

您的新版本可以缩短为:

$sql .= "Select * from test";

foreach($value as $n_k => $n_v)
{
    switch($n_v)
    {
        case '1':
            $sql .= " where (id = 1 ) "; 
        break;
        case '2':
            $sql .= " where (category = 4) ";
        break;
        case '3':
            $sql .= " where (location = 'U.S.') ";
        break;  
    }
}

$sql .= " GROUP BY id  ORDER BY stored_date DESC LIMIT 0, 5 ";

基本上归结为此。如果您必须添加多个 AND条件,则始终向查询添加WHERE 1=1(如果您没有其他修复(非动态)条件)。它没有任何改变,优化器会再次抛弃它。但是您可以轻松地添加任意数量的条件。这是我在编辑之前在原始答案中所做的。但请注意,在混合OR whatever = trueAND条件时,您无法添加OR。您将不得不使用parantheses来获取错误的结果集。这是您(0 OR ...)事件的来源。由于你只有1个条件,所以我现在根本没有必要。只需将其添加为WHERE whatever = true即可。

答案 1 :(得分:0)

如何将条件添加到sql?

类似的东西:

Select * from test where a=1
AND 
(
  ($n_v = 1 AND id = 1)
  OR
  ($n_v = 2 AND category = 4)
  OR
  ($n_v = 3 AND location = 'U.S.')
)