[英]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
(如果没有其他修复(非动态)条件)。 它不会改变任何东西,优化器会再次将其丢弃。 但是,您可以轻松添加任意数量的条件。 这就是我在编辑之前在原始答案中所做的事情。 但是请注意,在混合AND
和OR
条件时,您不能仅追加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.