SQL多次返回相同的结果

时间:2011-07-14 14:31:59

标签: mysql sql

我对高级MySQL命令相当新,我有多个关系的数据库表。我有一个高级搜索功能,必须将关键字匹配到几个字段(大多数在Assets表中,但在User表中有一对)。当我执行以下Query for 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 

4 个答案:

答案 0 :(得分:10)

您的查询中有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

答案 1 :(得分:1)

您可以使用SELECT DISTINCT子句,但实际问题看起来像Lukas制作的那个。使用显式连接是一种很好的做法:

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

答案 2 :(得分:1)

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

我还建议您开始使用正确的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

答案 3 :(得分:0)

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

添加类似

的内容
 AND  a.user_id = u.user_id