[英]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.