MySQL简单的搜索查询

时间:2012-01-08 22:53:31

标签: mysql

我已经得到了这个查询,我已经按照我认为正确的方式编写了它,但它返回了数千个结果,而且它们中的任何一个似乎都不匹配(除非巧合)。

SELECT DISTINCT a.id,a.name 
FROM auctioneers a,auctioneersloc al, auctioneerscont ac 
WHERE a.email LIKE "%mike.barker@example.co.uk%" 
OR ac.email LIKE "%mike.barker@example.co.uk%" 
ORDER BY name

我希望你能看到我在这里想做什么,但我看不出我做错了什么!
感谢您提供的任何帮助。 :)

2 个答案:

答案 0 :(得分:2)

您应该定义要加入正在使用的不同表的方式

例如。通过包含到a.id = al.auction_id(取决于你的数据库结构)这样的地方

永远不要忘记这一点的最简单方法是使用join命令; - )

答案 1 :(得分:2)

您所体验的内容被称为“笛卡尔积”(一张表中的每条记录都加入了另一张表中的每条记录)。当你在没有指定任何“ON”或(足够)“WHERE”条件的情况下连接表时会发生这种情况。

在不知道公共字段将三个表链接在一起的情况下,我将使用a.id并假设auctioneersloc和auctioneerscont表中存在名为“auctioneers_id”的foriegn密钥字段。但是你会想要一些看起来像这样的东西:

SELECT DISTINCT a.id,a.name 
FROM auctioneers a
INNER JOIN auctioneersloc al ON al.auctioneers_id = a.id
INNER JOIN auctioneerscont ac ON ac.auctioneers_id = a.id
WHERE a.email LIKE "%mike.barker@example.co.uk%" 
OR ac.email LIKE "%mike.barker@example.co.uk%" 
ORDER BY name

当然,如果“拍卖者”表格中的行要求匹配“auctioneersloc”或“auctioneerscont”表中的行,那么您应该使用LEFT JOIN(而不是INNER JOIN) )。

在更多的个人风格笔记中,我尝试始终明确指定我的JOIN。只需列出FROM子句中的所有表,但它依赖于WHERE子句来指定JOIN条件。从应用程序开发的角度来看,这可能很糟糕,如果在构建查询字符串时WHERE子句出现问题,您将获得笛卡尔积。始终记住指定JOIN关键字应该可以避免意外的CP这样。