2009-05-26 14 views
0

私はこのように設定する2つのテーブル(省略無関係な行)があります。今、私はからすべての行を取り出すクエリを作成したいMySQLのSQLクエリ - わからないそれを行う方法を適切に

> product 
    - id 
    - user_id 

> thread 
    - id 
    - prod_id 
    - user_id 
    - due_date 

をいずれかのスレッドテーブル:

  1. はのthread.user_idを有する
  2. はproduct.user_idが "5"
あるPROD_IDを有する "5"(例えば)私は...何かのように、これを行う方法がある。この時点まで

SELECT 
    thread.due_date 
FROM 
    product, thread 
WHERE 
    thread.user_id='5' 
OR 
    // not sure how to finish it 

を想定しています

、私はこれを行うためにPHPを使用しますが、実際に私のSQLの知識aをアップキックしたいと思います可能であればSQLを介してこれを動作させてください。

おかげ -

答えて

3

あなたがこれを行うには、外部結合を使用することができるはずです。

SELECT thread.* FROM thread 
LEFT OUTER JOIN product 
ON thread.prod_id = product.id 
WHERE thread.user_id = 5 OR product.user_id = 5 

あなたが見つけるかもしれない問題は、スレッドがユーザID 5を持っている場合は、重複したスレッドを得ることができるということですユーザーIDが5の製品もあります。それがあなたのケースでは問題になるかどうかは分かりません。あなたは私のような何かをするだろう

+0

潜在的な重複が問題である場合、平易な 'SELECT'ではなく' SELECT DISTINCT'が役に立ちます。 –

+0

SELECT DISTINCTアイデアと組み合わせて、これは私が必要としていた通りに正確に機能しました - ありがとう! – OneNerd

1

これらの(おかげでアレックスマルテッリ)を除去するSELECT DISTINCTを使用することができる場合があります

SELECT t.due_date 
FROM thread t 
INNER JOIN product p ON p.id = t.prod_id 
WHERE t.user_id = 5 OR p.user_id = 5 

編集: 私の例では、SQL 92標準を使用しています。しかし、

SELECT thread.due_date 
FROM product, thread 
WHERE product.id = thread.prod_id 
AND (thread.user_id = 5 OR product.user_id = 5) 

Beginning MySQLをチェックアウト - それは両規格に関するいくつかの良い情報を持っている:あなたはSQL-89スタイルに固執したいとあなたのオリジナルのポストから参加したい場合は、あなたのような何かを行うことができます。

+0

内部結合を使用する場合、対応する製品を持つバックスレッドのみを取得します –

0
SELECT thread.* LEFT OUTER JOIN product ON thread.prod_id=product.id WHERE thread.user_id=5 OR product.user_id=5; 

私はSELECTスレッドについてはわかりません*しかし、そのテーブル。* stuffはGRANTing特権のときに機能します。

関連する問題