Mysql SQL左连接/内部连接不同的结果
我不知道我做错了什么,但我无法为我的陈述找到解决方案。目前的声明是:Mysql SQL左连接/内部连接不同的结果,mysql,Mysql,我不知道我做错了什么,但我无法为我的陈述找到解决方案。目前的声明是: SELECT tb1.RestaurantID, Title, City FROM Restaurant AS tb1 LEFT JOIN RestaurantLunch AS tb2 ON tb1.RestaurantID = tb2.RestaurantID WHERE (MATCH (tb1.Title, tb1.City) AGAINST ('+string1* +string2*' IN BOOLEAN MODE))
SELECT tb1.RestaurantID, Title, City
FROM Restaurant AS tb1
LEFT JOIN RestaurantLunch AS tb2 ON tb1.RestaurantID = tb2.RestaurantID
WHERE (MATCH (tb1.Title, tb1.City) AGAINST ('+string1* +string2*' IN BOOLEAN MODE)) LIMIT 5;
当然,我还想在其他表(tb2)中搜索字符串,并将我的语句更改为:
SELECT tb1.RestaurantID, Title, City
FROM Restaurant AS tb1
LEFT JOIN RestaurantLunch AS tb2 ON tb1.RestaurantID = tb2.RestaurantID
WHERE (MATCH (tb1.Title, tb1.City, tb2.Text) AGAINST ('+string1* +string2*' IN BOOLEAN MODE)) LIMIT 5;
提交后,我得到了不同的结果,这根本不符合逻辑。为什么呢 当您执行左连接并在右侧表的where部分中创建一个条件时(在您的示例中为tb2),此左连接将成为具有该条件的普通连接。这就是为什么你会得到不同的结果 试着这样做:
SELECT tb1.RestaurantID, Title, City
FROM Restaurant AS tb1
LEFT JOIN RestaurantLunch AS tb2
ON tb1.RestaurantID = tb2.RestaurantID
AND (MATCH (tb2.Text)
AGAINST ('+string1* +string2*' IN BOOLEAN MODE))
WHERE (MATCH (tb1.Title, tb1.City)
AGAINST ('+string1* +string2*' IN BOOLEAN MODE)) LIMIT 5;
InnoDB表不允许在同一MATCH子句中搜索多个全文索引。因此,当向同一MATCH子句添加更多字段时,可能会得到不同的结果。这里的字段不都属于同一个表,因此它们被不同的索引覆盖 我认为您应该拆分搜索,以便在每个MATCH子句中使用一个全文索引。你可以试试
SELECT
tb1.RestaurantID, Title, City
FROM Restaurant AS tb1
LEFT JOIN RestaurantLunch AS tb2 ON tb1.RestaurantID = tb2.RestaurantID
WHERE (MATCH (tb1.Title, tb1.City) AGAINST ('+string1* +string2*' IN BOOLEAN MODE))
OR (tb2.Text IS NOT NULL AND MATCH (tb2.Text) AGAINST ('+string1* +string2*' IN BOOLEAN MODE))
LIMIT 5;
我刚刚修复了我在原始版本中留下的一个错误。你测试过编辑的版本吗?没有where子句中的
tb2.Text
?此外,如果是,请提供一些数据样本,以便我们可以确保它不起作用,或者它只是对返回的数据的错误解释。是的,我这样做了,但结果甚至不接近。我得到的结果是空的……您应该提供一个示例数据,说明使用左连接(一些行没有where子句)得到的结果,然后从这个示例中,使用添加的过滤器得到的结果应该是什么,这样我们就可以理解为什么它不起作用。另外,阅读文章中“Patrick O'Lone”的评论,看看是否与你的问题有关