繁体   English   中英

编写此MySQL查询的更简洁方法

[英]Cleaner way to write this MySql query

我通过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 ,这部分看起来确实很混乱。 Evn虽然效果很好,但看起来确实很差。 有人可以帮助我吗?

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

$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 如果不使用聚合函数,则不应使用它。 分组依据折叠一组行,并显示每个组中的随机行。 如果需要删除重复的行,请考虑在SELECT子句中使用DISTINCT关键字。

更新:

您的新版本可以这样缩短:

$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添加WHERE 1=1 (如果没有其他修复(非动态)条件)。 它不会改变任何东西,优化器会再次将其丢弃。 但是,您可以轻松添加任意数量的条件。 这就是我在编辑之前在原始答案中所做的事情。 但是请注意,在混合ANDOR条件时,您不能仅追加OR whatever = true 您将必须使用括号来获得错误的结果集。 这是您的(0 OR ...)来源。 由于您只有1个条件,所以我现在所说的完全没有必要。 只需将其添加为WHERE whatever = true就可以了。

如何将条件添加到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.')
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM