我已经得到了这个查询,我已经按照我认为正确的方式编写了它,但它返回了数千个结果,而且它们中的任何一个似乎都不匹配(除非巧合)。
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
我希望你能看到我在这里想做什么,但我看不出我做错了什么!
感谢您提供的任何帮助。 :)
答案 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这样。