繁体   English   中英

SQL LEFT JOIN / INNER JOIN不同的结果

[英]SQL LEFT JOIN/INNER JOIN different result

我不知道自己在做什么错,但找不到解决方案。 当前声明是:

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM