我通过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
连接的位置,因此该部分看起来非常混乱。虽然它工作正常,但它看起来很糟糕。任何人都可以帮我这个吗?
答案 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 = true
和AND
条件时,您无法添加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.')
)