2011-03-13 90 views
0

目前,我正在使我的网站应用程序验证郊区值,并确保它存在于数据库数据中。MySQL:如何提高我的查询?

这里是我的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个变量,是国家和郊区变量。

这是我的SQL语句,以检查是否此行存在:

“从postcodeTable选择*其中状态= '”。$状态 “ '和郊区LIKE' %” $郊区 “%'” ;

这里是我的示例表数据

Row1 id:1 postcode:3794 suburb: BANGHAM,BORDERTOWN,CANNAWIGARA,LOWAN, state: SA 
Row2 id:2 postcode:6627 suburb: CANNA, state: WA 

当用户输入郊区美人蕉状态SA它与MySQL声明这是不正确匹配。

它匹配因为LIKE语句,因为'CANNA'字在CANNAWIGARA郊区名称中。

这是不正确的,因为CANNA郊区只存在于WA状态。

有没有办法使LIKE语句更加智能,可以通过郊区字符串并确保它只与整个郊区名称匹配?

非常感谢!

回答

1

您可以尝试正则表达式匹配。但我认为规范化你的数据库会更好。也就是说,将郊区拆分成一张单独的表格,并用钥匙指向邮政编码表。那么你可以这样做:

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

这应该返回零行。

0

如果你需要搜索精确的比较,而使用

“从postcodeTable选择*其中状态='”。$状态。“”和郊区= $郊区

或掉落 “%” 。在

后面有一个可用的看看SQL通配符:http://www.w3schools.com/sql/sql_wildcards.asp

2

这里的问题是您的数据库模式:你不应该几个郊区存储在单场10表

相反,您应该有一个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' 
0

如果你不想修改你的表像人们所提出的建议,尝试:

“从postcodeTable选择*其中状态= '“。$ state。”'和郊区LIKE'%“。$ suburb。”%,'“;

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

0

尝试:

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

但由于许多人没有,我强烈建议你正常化您的模式

0

感谢您的回复!

傻我只是意识到,如果我只是在郊区领域添加一个逗号,它会解决问题。

由于我的郊区字符串中的“逗号”符号意味着surburb单词的结尾。

干杯!

0

感谢您的快速响应!

傻我刚刚意识到,如果我只是在郊区输入字段添加一个逗号,它会解决问题。

由于我的郊区字符串中的“逗号”符号意味着surburb单词的结尾。

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

干杯!

+0

'我刚刚意识到,如果我只是在郊区输入字段中添加一个逗号,就可以解决问题。“事实上,这**造成问题**而不是解决主要问题。有了这些怪癖,你的代码将难以理解/维护/发展。 – 2011-03-13 13:17:10

+0

Ey,这是我在我的答案中建议的!你应该接受它(虽然我知道它是越野车) – 2011-03-31 21:50:47