2012-04-03 34 views
1

バウチャーがバウチャーテーブル内で有効かどうかを確認するプログラムを実行しようとしています。プライマリテーブルの内容に基づく条件付き内部結合

バウチャーが有効期限を過ぎているかどうかなどの簡単な検証方法がありますが、特定の製品をブランドまたはサプライヤーで購入した顧客に基づいて条件付きであるバウチャーもあります。

バウチャーは、ブランドに固有ではないので、もし、私がバウチャー

id |  brand  |  supplier | value etc 

ブランド

id  |  name  etc 

とサプライヤー

id  |  name  etc 

のテーブルのテーブルのテーブルを持っていますバウチャーの物語の価値は0

です

私はテーブルに参加するこのSqlクエリを試しましたが、結果が得られません、私は使用しようとしているバウチャーコード(id)がブランドまたはサプライヤーに固有でないためですと仮定していますか?私は(取引先のためにsimiarly当時と)テーブルbrandsの接合がvouchersが0よりも大きいテーブルに値brandを条件となるように、これを書くとどのように

SELECT *, brands.name as brandName, suppliers.name as supplierName 
    FROM `vouchers` 
    INNER JOIN brands on vouchers.brand = brands.id 
    INNER JOIN suppliers on vouchers.supplier = suppliers.id 
    WHERE vouchers.id= '" & voucherCode & "' 

私は外観を持っていましたここにいくつかの他の質問が掲載されていますが、私はそれらを私の状況に関連付けることができる回答を完全には理解できません。

+0

なぜ条件付き結合を行いますか? 'INNER JOIN'の代わりに' LEFT JOIN'を使用してください。 nullレコードを受け取った場合、特定のレコードに対して結果が見つかりません。ヌルでない場合は、アプリケーションにロジックを適用します。ヌルの場合はブランドが見つかりません。データベース層でロジックを使用しないでください。 –

+0

これに答えて、単純に私はSqlとのごみです! –

答えて

1

:-)方法でMySQLデータベースを使用して

は、なぜあなたはちょうどこのよう代わりにLEFT JOINをしない:

SELECT *, brands.name as brandName, suppliers.name as supplierName 
    FROM `vouchers` 
    LEFT JOIN brands on vouchers.brand = brands.id 
    LEFT JOIN suppliers on vouchers.supplier = suppliers.id 
    WHERE vouchers.id= '" & voucherCode & "' 

彼らはbrandsを持っている場合、これはすべてのvouchers関係なく返されますかsuppliers

+0

@Jamie Hartnoll:答えが良いと思うなら、upvoteを忘れないでください。それは私たちに暖かく曖昧な気持ちを与える – Arion

0

してみてください、あなたが唯一の有効なバウチャーを返すようにしたいと仮定すると:

SELECT *, brands.name as brandName, suppliers.name as supplierName 
FROM `vouchers` 
LEFT JOIN brands on vouchers.brand = brands.id 
LEFT JOIN suppliers on vouchers.supplier = suppliers.id 
WHERE vouchers.id= '" & voucherCode & "' and 
     vouchers.brand = coalesce(brands.id, 0) and 
     vouchers.supplier = coalesce(suppliers.id, 0) 
関連する問題