簡體   English   中英

MySQL:如何改善我的查詢?

[英]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_postcodepostcodeTable外鍵
  • 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.

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