簡體   English   中英

如何在MySQL / PHP中按多個字段過濾

[英]How to filter by multiple fields in MySQL/PHP

我現在正在為應用程序編寫過濾器/排序功能,該功能將在每列上方顯示文本字段。 當用戶在每個字段中鍵入內容時,請求將被發送到后端進行排序。 由於大約有6個文本字段,所以我想知道是否有更好的排序方式,而不是使用if語句檢查每個變量,並寫特定的查詢(如果說所有字段都輸入了,只是一個或兩個字段)等

似乎會有很多if語句。 有沒有更直觀的方式來實現這一目標?

謝謝!

任何初始數據操作(例如排序)通常都是由數據庫引擎完成的。

除非您有特殊原因需要在應用程序本身中完成排序,否則在其中放置一個ORDER BY子句。


編輯:現在您說要過濾數據。 我仍然會在數據庫級別執行此操作。 向PHP發送巨大的數據集是沒有意義的,只是PHP必須經過它並在那里過濾數據。 在大多數情況下,在MySQL中執行此操作將比在PHP中構建效率高得多。

由於大約有6個文本字段,我想知道是否有更好的排序方式,而不是使用if語句檢查每個變量

絕對沒有

首先,按順序使用多個if沒錯。
相信我-我本人是減少代碼重復的忠實擁護者,但是請考慮將這些手動編寫的塊作為最佳解決方案。
接下來,盡管可以通過某種循環包裝這些條件,但是大多數情況下,不同的條件需要不同的處理。

但是,在下一個語句中,您錯了:

並編寫特定的查詢

您只需要一個查詢

似乎會有很多if語句。

為什么? 不超過您擁有的字段數。

這是自定義搜索查詢構建代碼的完整示例:

$w     = array();
$where = '';

if (!empty($_GET['rooms']))     $w[]="rooms='".mesc($_GET['rooms'])."'";
if (!empty($_GET['space']))     $w[]="space='".mesc($_GET['space'])."'";
if (!empty($_GET['max_price'])) $w[]="price < '".mesc($_GET['max_price'])."'";

if (count($w)) $where="WHERE ".implode(' AND ',$w);
$query="select * from table $where"; 

用戶進入查詢的唯一字段。

訂購將以幾乎相同的方式進行。

  • mesc是mysql_real_escape_string或任何其他適用的數據庫特定的字符串轉義函數的縮寫
select * from Users

order by Creadted desc, Name asc, LastName desc, Status asc

您的記錄將根據查詢的順序進行排序。

首先按Created desc創建,然后按Name asc依次類推。

但是從您的問題中我可以看到您正在搜索過濾結果。

因此,要按多個文件過濾,只需將您的位置附加在后面,或者如果您使用的是任何ORM,則可以通過對象方法來完成。

但是,如果它很簡單,您可以通過這種方式進行

$query = "";
foreach($_POST['grid_fields'] as $key => $value)
{
   if(strlen($query) > 0)
         $query .= ' and '
   $query .= sprintf(" %s LIKE '%s' ", mysql_real_escape_string($key), '%' .mysql_real_escape_string($value) .'%');  
}
if(strlen($query) > 0)
   $original_query .= ' where ' . $query;

這可以幫助您實現目標。

不能。在對集合進行排序時,您無法避免測試操作,因為您必須以相同的方式比較集合中的元素。 這樣做的載體是if語句。

你能看看這個嗎?

WHERE (ifnull(@filter1, 1) = 1 or columnFilter1 = @filter1)
  and (ifnull(@filter2, 1) = 1 or columnFilter2 = @filter2)
  and (ifnull(@filter3, 1) = 1 or columnFilter3 = @filter3)
  and (ifnull(@filter4, 1) = 1 or columnFilter4 = @filter4)
  and (ifnull(@filter5, 1) = 1 or columnFilter5 = @filter5)
  and (ifnull(@filter6, 1) = 1 or columnFilter6 = @filter6)

如果我誤解了您的問題,請讓我知道。它不像IF語句批處理,而且很冗長,但是您認為呢?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM