MySQL:如何改进我的查询?

时间:2011-03-13 12:39:49

标签: mysql sql

目前我正在制作我的网站应用程序以验证郊区值并确保其存在于数据库数据中。

这是我的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语句,用于检查行是否存在:

“select * from postcodeTable where state ='”。$ state。“'和suburb 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语句更智能,可以通过郊区字符串并确保它只匹配整个郊区名称?

提前非常感谢!

7 个答案:

答案 0 :(得分:2)

这里的问题是您的数据库架构:您不应将多个郊区存储在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'

答案 1 :(得分:1)

您可以尝试正则表达式匹配。但我认为规范化数据库会更好。也就是说,将郊区拆分在一个单独的表中,其中一个键指向邮政编码表。然后你可以这样做:

SELECT * FROM postcodeTable p
LEFT JOIN suburbTable s ON s.postcode_id = p.id
WHERE p.state = 'SA' AND s.name = 'CANNA';

哪一行应返回零行。

答案 2 :(得分:0)

如果您需要搜索确切的比较,请使用

“select * from postcodeTable where state ='”。$ state。“'和suburb = $ suburb

或将“%”放在后面。

查看可用的SQL通配符:http://www.w3schools.com/sql/sql_wildcards.asp

答案 3 :(得分:0)

如果您不想按照人们的建议修改表格,请尝试:

“select * from postcodeTable where state ='”。$ state。“'和suburb LIKE'%”。$ suburb。“%,'”;

它将解决一些问题,但不是全部问题。

答案 4 :(得分:0)

尝试:

$query = "select * from postcodeTable
  where state='".$state."' and suburb REGEXP '(^|,)".$suburb."(,|$)'";

但正如其他许多人所做的那样,我强烈建议您规范您的架构

答案 5 :(得分:0)

感谢您的回复!

愚蠢的我,我刚才意识到如果我只是在郊区字段中添加一个逗号,它就能解决问题。

由于我的郊区字符串中的“逗号”符号表示surburb字的结尾。

干杯!

答案 6 :(得分:0)

感谢您的快速回复!

愚蠢我只是意识到如果我只是在郊区输入字段中添加一个逗号,它就可以解决问题。

由于我的郊区字符串中的“逗号”符号表示surburb字的结尾。

感谢您的建议!当我有机会时,我会规范化我的邮政编码表。

干杯!