2011-07-14 199 views
1

我對高級MySQL命令相當新穎,我有具有多個關係的數據庫表。我有一個高級搜索功能,必須將關鍵字匹配到幾個字段(大多數在資產表中,但在用戶表中有一對)。當我爲桌面執行以下查詢時,它會多次返回相同的行,而它應該執行一次。SQL多次返回相同的結果

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 
+0

可以粘貼輸出的樣本? – Yuck

+0

查詢是否與單個行中的搜索關鍵字多次匹配?這可能會讓你走上正軌 – Ryan

回答

9

您在查詢中有cartesian product。您應該加入資產和用戶,例如與

WHERE a.user_id = u.id 

或類似這樣的

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

UPDATE:您的評論表明你真的想 「左外連接」 用戶表。這意味着,所有資產都在結果集不管是否存在匹配的用戶:

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

+0

請儘量選擇後者。保持連接標準和選擇標準分離使得更好的可讀性。 – Yuck

+0

@Yuck:絕對。但是對於新手來說,一次只能邁出一步:-) –

+0

謝謝,這是它缺少的確切的東西。 –

0

你缺少兩個表之間的連接。

添加類似

AND a.user_id = u.user_id 
1

你可以使用SELECT DISTINCT子句,儘管實際問題看起來像由盧卡斯做出的一個。最好使用如下所示的顯式連接:

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

嗯,是的。 'DISTINCT'在這種情況下是正確的,沒有'用戶'的投影。你的DBA會殺了你;-) –

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 
相關問題