2014-03-12 81 views
2

我的表我有一列'x'是1或0.我需要一個MySQL查詢返回所有行,或者那些其中x = 1或其中x = 0。MySQL查詢與可選過濾器

我想要的那三個結果中的哪一個被設置在變量$ type中。我所做的是創建三個查詢和if語句:

if ($type == 'all') $query = "SELECT * FROM contracts"; 
elseif ($type == 'n') $query = "SELECT * FROM contracts WHERE x = '0'"; 
elseif ($type == 'f') $query = "SELECT * FROM contracts WHERE x = '1'"; 

這工作,但我似乎並沒有最佳的解決方案給我,因爲我必須寫3次幾乎相同的查詢,如果我想改變的東西我必須改變它3次。

我試圖讓$ type ='',0或1,然後WHERE x = '$type',但那不起作用。

我該如何使用只有一個MySQL查詢?

回答

1
if ($type = 'all') { 
    $filter = ''; 
} elseif ($type == 'n') { 
    $filter = "WHERE x = '0'"; 
} elseif ($type == 'f') { 
    $filter = "WHERE x = '1'"; 
} else { 
    die("Invalid filter type: $type"); 
} 
$query = "SELECT * FROM contracts $filter"; 

如果您使用以下方案:$type = '', 0, or 1,你可以這樣做:

$query = "SELECT * FROM contracts"; 
if ($type !== '') { 
    $query .= " WHERE x = '$type'"; 
} 
+0

幾乎所有的答案都很好,類似。我選擇了這一個。謝謝! – almo

0
switch($type){ 
    case 'n': 
     $where = "WHERE x = '0'"; 
     break; 
    case 'f': 
     $where = "WHERE x = '1'"; 
     break; 
    default: 
     $where = ""; 
     break; 
} 
$query = 'SELECT * FROM contracts '.$where; 
0
$query = 'SELECT * FROM contracts'; 
if ($type != 'all') 
    $query .= ' WHERE x = \'' . ($type == 'n' ? 0 : 1) . '\''; 
0

試試這個

$query = "SELECT * FROM contracts" . ($type != 'all' ? (" where x = '" . intval($type == 'n') . "'") : '') 
0

既然你做了翻譯n至0和f到1等,在mysql查詢中這樣做將要求不必要複雜的CASE語句。我寧願只包括必要的字符串:

if ($type == 'all') $typeLimiter = " "; 
elseif ($type == 'n') $typeLimiter = " AND x = '0' "; 
elseif ($type == 'f') $typeLimiter = " AND x = '1' "; 

這樣可以疊加無限AND/OR語句到你的查詢:

$query = "SELECT * FROM contracts 
    WHERE 1 = 1 
    $typeLimiter"; 

注意,我包括WHERE 1 = 1作爲第一個語句,因此任何/所有/您的限制器都不可以應用,或者沒有。