簡體   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