[英]MySQL: how to improve my query?
目前,我正在制作我的網站應用程序,以驗證郊區值並確保其存在於數據庫數據中。
這是我的MySQL表
CREATE TABLE IF NOT EXISTS `postcodeTable` (
`id` int(11) NOT NULL,
`postcode` varchar(50) NOT NULL,
`suburb` text NOT NULL,
`state` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
用戶輸入2個變量,分別是State和Suburb變量。
這是我的SQL語句,用於檢查該行是否存在:
“從postcodeTable中選擇*,其中state ='”。$ state。“'和郊區LIKE'%”。$ suburb。“%'”;
這是我的樣本表數據
Row1 id:1 postcode:3794 suburb: BANGHAM,BORDERTOWN,CANNAWIGARA,LOWAN, state: SA
Row2 id:2 postcode:6627 suburb: CANNA, state: WA
當用戶輸入郊區CANNA並處於SA狀態時,它與不正確的MySQL語句匹配。
之所以匹配,是因為LIKE語句是因為CANNAWIGARA郊區名稱中的“ CANNA”字樣。
這是不正確的,因為CANNA郊區僅存在於WA州。
有沒有一種方法可以使LIKE語句更智能,使其可以遍歷郊區字符串並確保僅匹配整個郊區名稱?
非常感謝!
這里的問題是數據庫模式: 您不應將多個郊區存儲在postcodeTable
表的單個字段中 。
相反,您應該有一個suburbs
表,該表每行將存儲一個郊區,並且外鍵指向相應的postcodeTable
行。
您的postcodeTable
表將是:
id
postcode
state
您的suburbs
表將是:
id_suburb
id_postcode
: postcodeTable
外鍵 name
然后,由於suburbs.name
。名稱將包含一個郊區的確切名稱,因此您不必再使用like %...%
了:您只需要使用suburbs.name = '...'
這是您的SQL查詢的外觀的一個想法:
select postcodeTable.*
from postcodeTable
inner join suburbs on suburbs.id_postcode = postcodeTable.id
where
suburbs.name = 'CANNA'
and postcodeTable.state = 'SA'
您可以嘗試使用正則表達式匹配。 但是我認為最好規范化數據庫。 也就是說,將郊區分割為一個單獨的表,並使用鍵指向郵政編碼表。 然后,您可以執行以下操作:
SELECT * FROM postcodeTable p
LEFT JOIN suburbTable s ON s.postcode_id = p.id
WHERE p.state = 'SA' AND s.name = 'CANNA';
應該返回零行。
如果您需要搜索精確比較,請使用
“從postcodeTable中選擇*,其中state ='”。$ state。“',而郊區= $ suburb
或將“%”放在后面。
看一下可用的SQL通配符: http : //www.w3schools.com/sql/sql_wildcards.asp
如果您不想像人們建議的那樣修改表,請嘗試:
“從postcodeTable中選擇*,其中state ='”。$ state。“'和郊區LIKE'%”。$ suburb。“%,'”;
它將解決一些問題,但不是全部。
嘗試:
$query = "select * from postcodeTable
where state='".$state."' and suburb REGEXP '(^|,)".$suburb."(,|$)'";
但是,與其他許多人一樣,我強烈建議您標准化自己的架構 。
感謝您的回復!
愚蠢的我,我剛剛意識到,只要在郊區添加逗號,就可以解決問題。
由於我的郊區字符串中的“逗號”符號表示surburb詞的結尾。
干杯!
感謝您的快速回復!
愚蠢的我,我剛剛意識到,只要在郊區輸入字段中添加逗號,就可以解決問題。
由於我的郊區字符串中的“逗號”符號表示surburb詞的結尾。
感謝您的建議! 如果有機會,我會規范我的郵政編碼表。
干杯!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.