SQL 多次返回相同的结果

Posted

技术标签:

【中文标题】SQL 多次返回相同的结果【英文标题】:SQL returning the same result multiple times 【发布时间】:2011-07-14 14:31:58 【问题描述】:

我对高级 mysql 命令相当陌生,我有多个关系的数据库表。我有一个高级搜索功能,必须将关键字与几个字段匹配(大多数在 Assets 表中,但在 User 表中)。当我对桌面执行以下查询时,它会多次返回同一行,而它应该执行一次。

 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 

【问题讨论】:

你能粘贴一个输出样本吗? 查询是否在一行中多次匹配搜索关键字?这可以让你走上正轨 【参考方案1】:

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

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

在此处阅读有关加入表格的更多信息:http://dev.mysql.com/doc/refman/5.5/en/join.html

【讨论】:

请选择后者。将连接标准和选择标准分开可以提高可读性。 @Yuck:当然。但对于新手来说,一步一步来:-) 谢谢,这正是它所缺少的东西。 @Travis:通常,如果您的记录似乎重复(在更复杂的查询中也是如此),您始终可以先搜索笛卡尔积。 95% 你会在那里发现问题 我遇到了一个新问题,如果资产未分配给用户,即使搜索它也不会显示。我假设这是因为它与 a.user_id = u.id 不匹配。有没有办法添加 OR a.user_id = NULL (我已经尝试过,但没有用)?【参考方案2】:

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

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

【讨论】:

嗯,没错。 DISTINCT 在这种情况下是正确的,没有来自 users 的预测。你的 DBA 会杀了你 ;-)【参考方案3】:

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

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

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
INNER JOIN Users U ON A.user_id = U.user_id
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

【讨论】:

【参考方案4】:

您缺少两个表之间的连接。

添加类似的东西

 AND  a.user_id = u.user_id

【讨论】:

以上是关于SQL 多次返回相同的结果的主要内容,如果未能解决你的问题,请参考以下文章

sql语句 分次(多次)获取不重复记录,请高手赐教!

为啥相同的 SQL 查询可能在 SQL Developer 和代码中返回不同的结果?

DQL 和等效 SQL 不返回相同数量的结果集

SQL将的同一个分组中的值连接起来,返回一个字符串结果 使用group_concat()

使用 Mockito 多次调用具有相同参数的相同方法

使用 Mockito 多次调用具有相同参数的相同方法