廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 6362 個閱讀者
 
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
chris710908 手機 會員卡
個人文章 個人相簿 個人日記 個人地圖
知名人士
級別: 知名人士 該用戶目前不上站
推文 x15 鮮花 x128
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片
推文 x0
[PHP][求助] 請問mysql中進階查詢的語法如何下?
想請問一下~目前在做搜尋頁面的部份
假設我想要讓使用者下拉選單來進行搜尋

所以我資料庫的語法

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月份的資料

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


[ 此文章被chris710908在2008-08-14 14:11重新編輯 ]



獻花 x0 回到頂端 [樓 主] From:臺灣中華電信HINET | Posted:2008-08-13 20:59 |
rubenjy
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x2 鮮花 x24
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

設一個變數
利用if 判斷where後面的條件式
在非null(或空白)時
將條件式加到變數裡面
然後再where 變數 去查詢你要的資料


獻花 x0 回到頂端 [1 樓] From:臺灣數位聯合 | Posted:2008-08-13 21:15 |
chris710908 手機 會員卡
個人文章 個人相簿 個人日記 個人地圖
知名人士
級別: 知名人士 該用戶目前不上站
推文 x15 鮮花 x128
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

謝謝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 回到頂端 [2 樓] From:臺灣中華電信HINET | Posted:2008-08-14 10:55 |
chris710908 手機 會員卡
個人文章 個人相簿 個人日記 個人地圖
知名人士
級別: 知名人士 該用戶目前不上站
推文 x15 鮮花 x128
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

我後來利用表單變數的值來改變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);


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

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

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


[ 此文章被chris710908在2008-08-30 00:50重新編輯 ]


獻花 x0 回到頂端 [3 樓] From: | Posted:2008-08-14 14:09 |
aa 手機 會員卡 葫蘆墩家族
個人文章 個人相簿 個人日記 個人地圖 個人商品
特殊貢獻獎 社區建設獎
頭銜:            
站長
級別: 站長 該用戶目前不上站
推文 x1964 鮮花 x5260
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

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 回到頂端 [4 樓] From:臺灣新世紀資通股份有限公司 | Posted:2008-08-30 09:33 |
chris710908 手機 會員卡
個人文章 個人相簿 個人日記 個人地圖
知名人士
級別: 知名人士 該用戶目前不上站
推文 x15 鮮花 x128
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

感謝aa站長鼎力相助^^
我去修改一下~謝謝


獻花 x0 回到頂端 [5 樓] From: | Posted:2008-08-30 12:14 |

首頁  發表文章 發表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.054767 second(s),query:16 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言