Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.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_Sql_Join - Fatal编程技术网

Mysql 如何通过多重比较实现SQL连接?

Mysql 如何通过多重比较实现SQL连接?,mysql,sql,join,Mysql,Sql,Join,好的,我使用的是MySQL5.16,我试图根据用户的ID和表之间的消费金额是否不同,加入两个非常相似的用户表。我主要是想看看表a中的金额,找到表b中所有不存在或不同的对应条目 下面是我的示例代码: SELECT table_a.* FROM table_a LEFT JOIN table_b ON table_a.id = table_b.id AND table_a.total_spent != table_b.total_spent 我得到的错误是语法

好的,我使用的是MySQL5.16,我试图根据用户的ID和表之间的消费金额是否不同,加入两个非常相似的用户表。我主要是想看看表a中的金额,找到表b中所有不存在或不同的对应条目

下面是我的示例代码:

SELECT  table_a.*
FROM    table_a LEFT JOIN
        table_b   ON  table_a.id = table_b.id
AND     table_a.total_spent != table_b.total_spent
我得到的错误是语法错误:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'total_spent != table_b.total_spent' at line 5
这可能是我所缺少的一些明显的东西,但我发现网上没有人问过这个具体的问题。此查询的预期结果是表_a中的所有条目的列表,这些条目要么在表_b中没有对应的条目,要么在表_b中有对应的条目,但该条目的总花费不同

编辑:

好吧,我把左边的连接搞糟了。下面是代码:

SELECT  table_a.*
FROM    table_a LEFT JOIN
        table_b   ON  table_a.id = table_b.id
WHERE   table_a.total_spent != table_b.total_spent
OR      (table_a.total_spent IS NOT NULL AND table_b.total_spent IS NULL)
OR      (table_a.total_spent IS NULL AND table_b.total_spent IS NOT NULL)

你试过了吗:
table\u a.total\u-spend table\u b.total\u-spend

我刚试过你的说法,看这里,它基本上是有效的。但是,由于
WHERE
子句中明确排除了
LEFT JOIN
条件
table_a.id=table_b.id
,因此您永远不会得到结果。这只允许无法链接
表b
的记录。因此,
表b.总花费
将永远无法用于比较(即使结果为负)

编辑

我一直在进一步摆弄。也许这就是你想要的:?我添加了一些更有用的数据-不同的ID并删除了
WHERE
子句的第二个条件

重新排列了my fiddle(),以便它现在可以以原始形式容纳您的查询:

SELECT  table_a.*
FROM    table_a LEFT JOIN
        table_b ON  table_a.id = table_b.id
WHERE   table_b.id IS NULL
AND     table_a.total_spent != table_b.total_spent
在那里我没有得到语法错误(也没有结果,但上面已经解释过了)

2。编辑

好的,这是一个完全不同的
WHERE
子句。你可以做得更短一些

SELECT  table_a.*
FROM    table_a LEFT JOIN
        table_b   ON  table_a.id = table_b.id
WHERE   ifnull(table_a.total_spent,-1) != ifnull(table_b.total_spent,-1)

ifnull()
中的
-1
表示一个不应作为“合法”值存在的值,但这使得只需进行一次比较即可

尝试排除table b id null条件

SELECT  table_a.*
FROM    table_a LEFT JOIN table_b   ON  table_a.id = table_b.id
WHERE   table_a.total_spent <> table_b.total_spent
选择表a*
从表a左连接表a上的表b.id=表b.id
其中表a.总计花费表b.总计花费

语法错误很可能是拼写错误。检查表定义

然而:

我基本上是想看看表a中的数量,然后找到所有的 表_b中不存在或 它们是不同的

您的查询不会这样做

SELECT  table_a.*
FROM    table_a LEFT JOIN
        table_b   ON  table_a.id = table_b.id
WHERE   table_a.total_spent != table_b.total_spent
OR      (table_a.total_spent IS NOT NULL AND table_b.total_spent IS NULL)
OR      (table_a.total_spent IS NULL AND table_b.total_spent IS NOT NULL)
第一个条件测试两个表是否都有一个值并且它们不相等

第二个条件测试表_a是否有值而表_b没有值。它还将间接测试表b是否完全没有记录,因此添加
或表b为NULL实际上是多余的

第三个条件测试表_a是否缺少值,表_b是否有该值。我不能肯定最后一个条目是否对你有用。这取决于
表a.total\u spend
是否可为空


由于您正在运行左联接,因此不会看到表_b中的任何值,其中不存在表_a中的任何记录。

虽然我实际上不确定正确的语法(我会尝试使用“”或者如果它不起作用,我认为有一个逻辑错误。您正在尝试对存在ID的表进行左连接;但随后查找ID为null的位置。我相信逻辑缺陷在于where子句,而不是AND子句

SELECT  table_a.*
FROM    table_a 
LEFT JOIN table_b ON table_a.id = table_b.id
WHERE   table_b.id IS NULL
AND     table_a.total_spent != table_b.total_spent
只是我的想法:)
-Josh

同样的错误。我认为这不是运算符的选择。请粘贴实际的语法错误。它现在就在那里。很抱歉。您应该将
子句放入您的
语句中。至于你为什么会出错,我不知道。列是否确实存在?将AND子句放入我的ON语句中会产生相同的错误,但现在是第4行而不是第5行。这是我的错误。我正在尝试在SE上看到的其他东西,我认为需要where子句。不过,如果没有它,错误仍然存在。编辑:在sqlfiddle站点上,我注意到几乎完全相同的命令工作原理与我希望的完全相同。也许我的MySQL版本只是有一些MySQL 5.6没有的奇怪的怪癖。请先检查这是否有效:
SELECT table_a.*从table_a左JOIN table_b ON table_a.id=table_b.id
同一行上的同一个精确错误:table_a.total_depend!=表b.支出总额。这个版本看起来确实比我使用的好,但它不起作用。而且我很确定这不是一个拼写错误,因为我实际上是将这些内容复制粘贴到命令中,而不是手动键入。@user966111是
total\u-spend
表a
中某些内容的列别名?在MySQL中不能这样做。你必须使用基本列名。你的确切意思是什么?表a和表b的列基本相同。其中一个常见的列是total_Consumed。它们的列名是相同的。好吧,这个查询成功了,我只需要在所有内容周围加上反勾。不,我不知道为什么。询问Oracle。@user966111如果可以通过添加字段标识符来解决,我最好的猜测是其中一列的名称是保留字或函数名或其他名称。“”或类似名称“
=是等效的。这并不能回答这个问题。@Ram…你怎么知道这不是答案?我明白了…你有答案了…为什么不分享呢,小飞象…别装垃圾收集器了。。。