請問mysql中進階查詢的語法如何下?

Home Home
引用 | 編輯 chris710908
2008-08-13 20:59
樓主
推文 x0
想請問一下~目前在做搜尋頁面的部份
假設我想要讓使用者下拉選單來進行搜尋

所以我資料庫的語法

SELECT *
FROM channel_marketing
WHERE (p_type =colname) OR (c_type =comtype) OR (c_name =comname) OR (year =s_year) OR

(month =s_month) OR (week =s_week)

其中資料庫欄位對的是表單變數的值~我在搜尋頁面中設定表單傳送變數

而上面的資料庫查詢則是依據變數將資料show出來

只是上面的語法是針對使用者使用"單一欄位"作搜尋時

可以正確搜出資料(例如使用年份欄位2008),這樣他會把2008的資料撈出來

但是如果他選擇年份跟月份....這樣他就會聯集年份或月份的資料~假設我要2008-02的資料

他會將2008-03, 2006-02的資料也撈出來,但是這不是他想要的

他應該是要跑出交集的部份~2008年2月份的資料

不知道該怎麼下語法??可否請高手幫幫忙~謝謝

獻花 x0
引用 | 編輯 rubenjy
2008-08-13 21:15
1樓
  
設一個變數
利用if 判斷where後面的條件式
在非null(或空白)時
將條件式加到變數裡面
然後再where 變數 去查詢你要的資料

獻花 x0
引用 | 編輯 chris710908
2008-08-14 10:55
2樓
  
謝謝rubenjy大大~只是我不太會改...

其中下面的部份程式碼是主要判斷搜尋欄位的原始程式..我目前的改法只能針對某些搜尋條件然後寫死

例如限制c_name AND year AND month(三者作and~缺一不可)
另外在設定兩組or, 可以選擇c_type 或 p_type作搜尋~但是不能and

這樣感覺就是很沒有彈性....


$colname_search = "-1";
if (isset($_POST['C_name'])) {
$colname_search = $_POST['C_name'];
}
$s_year_search = "-1";
if (isset($_POST['s_year'])) {
$s_year_search = $_POST['s_year'];
}
$s_month_search = "-1";
if (isset($_POST['s_month'])) {
$s_month_search = $_POST['s_month'];
}
$comtype_search = "-1";
if (isset($_POST['c_type'])) {
$comtype_search = $_POST['c_type'];
}
$photype_search = "-1";
if (isset($_POST['p_type'])) {
$photype_search = $_POST['p_type'];
}
mysql_select_db($database_mio, $mio);
$query_search = sprintf("SELECT * FROM channel_marketing WHERE (c_name = %s AND year=%s AND month=%s) OR (c_type=%s) OR (p_type=%s)", GetSQLValueString($colname_search, "text"),GetSQLValueString($s_year_search, "int"),GetSQLValueString($s_month_search, "int"),GetSQLValueString($comtype_search, "text"),GetSQLValueString($photype_search, "text"));
$search = mysql_query($query_search, $mio) or die(mysql_error());
$row_search = mysql_fetch_assoc($search);
$totalRows_search = mysql_num_rows($search);

獻花 x0
引用 | 編輯 chris710908
2008-08-14 14:09
3樓
  
我後來利用表單變數的值來改變sql語法

假設我有廠商類別-廠商名稱-產品品牌-產品型號-年-月六個搜尋欄位,就要針對這六個欄位作排列組合....

語法如下:

mysql_select_db($database_mio, $mio);
$add_sql = "or (c_name =c_name)";
//判斷查詢欄位
//item 6
if($_POST['s_name']!='' and $_POST['s_brand']!='' and $_POST['p_name']!='' and $_POST['s_year']!='' and $_POST['s_month']!='' and $_POST['s_month2']!=''){
$add_sql = "or (c_name ='".$_POST['s_name']."' AND brand= '".$_POST['s_brand']."' AND p_name= '".$_POST['p_name']."' AND year =".$_POST['s_year']." AND month BETWEEN ".$_POST['s_month']." AND ".$_POST['s_month2'].")";
}

//item 5
else if($_POST['s_name']!='' and $_POST['s_brand']!='' and $_POST['s_year']!='' and $_POST['s_month']!='' and $_POST['s_month2']!=''){
$add_sql = "or (c_name ='".$_POST['s_name']."' AND brand= '".$_POST['s_brand']."' AND year =".$_POST['s_year']." AND month BETWEEN ".$_POST['s_month']." AND ".$_POST['s_month2'].")";
}
................以此類推

$query_search = "SELECT * FROM sales WHERE 0 $add_sql ORDER BY year ASC, month ASC";
$query_limit_search = sprintf("%s LIMIT %d, %d", $query_search, $startRow_search, $maxRows_search);
$search = mysql_query($query_limit_search, $mio) or die(mysql_error());
$row_search = mysql_fetch_assoc($search);


我想這種方法應該是很笨的作法........可是不這樣作~我也不知道使用者會使用哪種欄位作搜尋

所以只能土法煉鋼.江可能的組合都打出來

請問還有什麼好方法嗎... 表情

獻花 x0
引用 | 編輯 aa
2008-08-30 09:33
4樓
  
SELECT *
FROM channel_marketing
WHERE (p_type =colname) OR (c_type =comtype) OR (c_name =comname) OR (year=s_year) OR (month =s_month) OR (week =s_week)

其實我的做法跟你最後的做法類似,只是可以精減一下..

複製程式
$sqlwh='';
if ($colname) $sqlwh.=' OR p_type='$colname';
if ($comtype) $sqlwh.=' OR c_type='$comtype';
if ($comname) $sqlwh.=' OR c_name='$comname';
if ($s_year && $s_month) $sqlwh.=' OR (year='$s_year' AND month='$s_month')';
elseif ($s_year) $sqlwh.=' OR year='$s_year';

$sql = "SELECT * FROM sales WHERE 0 $sqlwh ORDER BY year ASC, month ASC";


獻花 x0
引用 | 編輯 chris710908
2008-08-30 12:14
5樓
  
感謝aa站長鼎力相助^^
我去修改一下~謝謝

獻花 x0