2011-07-14 9 views
1

高度なMySQLコマンドでかなり新しいですが、複数の関係を持つデータベーステーブルがあります。私はいくつかのフィールドにキーワードを一致させる必要がある高度な検索機能を持っています(ほとんどがAssetsテーブルにありますが、Userテーブルには2つあります)。次のクエリを実行すると、同じ行が複数回返されますが、一度実行する必要があります。同じ結果を複数回返す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

@ヤク:もちろんです。しかし初心者のための一歩一歩: –

+0

ありがとう、これは欠けていた正確なものです。 –

0

次の2つのテーブル間の結合不足しています。

は、実際の問題は、ルーカスによって作られたもののように見えるけれどもあなたは、SELECT DISTINCT句を使用することができ

AND a.user_id = u.user_id 
1

のようなものを追加します。

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

Hmm、true。この場合、 'DISTINCT'は' users'からの予測なしで正しいでしょう。 DBAがあなたを殺すでしょう;-) –

1

あなたは実際に2つのテーブル(資産およびユーザー)に参加する必要があります。それは、明示的にはそうのような結合を使用することをお勧めします。あなたが持っているので、各テーブルのすべての行は、他の行のすべての行と一致します。これはデカルト積として知られており、通常は悪いことです。

私はまた、あなたが正しい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 
関連する問題