Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL左连接/内部连接不同的结果_Mysql - Fatal编程技术网

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”的评论,看看是否与你的问题有关