Mysql 多次返回相同结果的SQL

Mysql 多次返回相同结果的SQL,mysql,sql,Mysql,Sql,我对高级MySQL命令相当陌生,我有多个关系的数据库表。我有一个高级搜索功能,它必须将关键字与资产表中的几个字段匹配,但在用户表中有几个字段。当我对desk执行以下查询时,它多次返回同一行,而它应该执行一次 SELECT a.id, a.asset_id, a.name, a.serial_number, a.category_id, a.status_id, a.user_id, a.location_id FROM assets a, users u WHERE

我对高级MySQL命令相当陌生,我有多个关系的数据库表。我有一个高级搜索功能,它必须将关键字与资产表中的几个字段匹配,但在用户表中有几个字段。当我对desk执行以下查询时,它多次返回同一行,而它应该执行一次

 SELECT 
   a.id, a.asset_id, a.name, a.serial_number, a.category_id, a.status_id, a.user_id, a.location_id 
 FROM 
   assets a, users u 
 WHERE 
  (a.asset_ID LIKE '%desk%' OR a.name LIKE '%desk%' OR (u.first_name LIKE '%desk%' OR u.last_name LIKE '%desk%')) AND 
  a.serial_number LIKE '%%' AND 
  a.category_id='2' 
 LIMIT 25 OFFSET 5450 
您的查询中有一个。您应该加入资产和用户,例如

WHERE a.user_id = u.id
还是像这样

FROM assets a JOIN users u ON a.user_id = u.id
更新:您的评论表明您实际上想要加入用户表。这意味着,无论是否存在匹配的用户,所有资产都在结果集中:

FROM assets a LEFT OUTER JOIN users u ON a.user_id = u.id
在此处阅读有关联接表的更多信息:

您的查询中有一个。您应该加入资产和用户,例如

WHERE a.user_id = u.id
还是像这样

FROM assets a JOIN users u ON a.user_id = u.id
更新:您的评论表明您实际上想要加入用户表。这意味着,无论是否存在匹配的用户,所有资产都在结果集中:

FROM assets a LEFT OUTER JOIN users u ON a.user_id = u.id

在此处阅读有关联接表的详细信息:

您缺少两个表之间的联接

添加如下内容

 AND  a.user_id = u.user_id

您缺少两个表之间的连接

添加如下内容

 AND  a.user_id = u.user_id

您可以使用SELECT DISTINCT子句,尽管实际问题看起来像是Lukas提出的问题。使用显式联接是一种很好的做法,如下所示:

 FROM assets a
 JOIN users u ON a.user_id=u.id

您可以使用SELECT DISTINCT子句,尽管实际问题看起来像是Lukas提出的问题。使用显式联接是一种很好的做法,如下所示:

 FROM assets a
 JOIN users u ON a.user_id=u.id

实际上,您需要将两个表资产和用户连接在一起。正如您所看到的,每个表中的每一行都与另一个表中的每一行相匹配。这被称为笛卡尔积,通常是一件坏事

我还建议您开始使用正确的连接语法:


实际上,您需要将两个表资产和用户连接在一起。正如您所看到的,每个表中的每一行都与另一个表中的每一行相匹配。这被称为笛卡尔积,通常是一件坏事

我还建议您开始使用正确的连接语法:


能否粘贴输出的示例?查询是否在一行中多次匹配搜索关键字?这可以让您走上正确的轨道。您可以粘贴输出的示例吗?查询是否在一行中多次匹配搜索关键字?这可能会让你走上正确的道路,但请选择后者。保持连接条件和选择条件分开有助于提高可读性。@恶心:绝对是。但对于新手来说,一步一个脚印:-谢谢你,这正是它缺少的东西。@Travis:一般来说,如果你的记录在更复杂的查询中似乎也重复,你总是可以先搜索笛卡尔积。95%您会发现问题,因此我遇到了一个新问题,如果资产未分配给用户,即使搜索也不会显示该资产。我假设这是因为它与a.user\u id=u.id不匹配。有没有一种方法可以添加或a.user_id=NULL我已经尝试过了,但没有成功?请选择后者。保持连接条件和选择条件分开有助于提高可读性。@恶心:绝对是。但对于新手来说,一步一个脚印:-谢谢你,这正是它缺少的东西。@Travis:一般来说,如果你的记录在更复杂的查询中似乎也重复,你总是可以先搜索笛卡尔积。95%您会发现问题,因此我遇到了一个新问题,如果资产未分配给用户,即使搜索也不会显示该资产。我假设这是因为它与a.user\u id=u.id不匹配。有没有办法添加或a.user_id=NULL我已经试过了,但没用?嗯,是的。在这种情况下,如果没有用户的预测,DISTINCT将是正确的。你的DBA会杀了你-嗯,没错。在这种情况下,如果没有用户的预测,DISTINCT将是正确的。你的DBA会杀了你-