1

私はすでに問題を提出していますが、例がなければ十分に明確ではなかったので、ここに表があります:

Users
id_user / key_user
1       / 123FDADA21312QD
2       / 994GFCS4595433D

Companies
id_company / key_company
1          / 3123123123
2          / 5435345454

Products
id_product / id_company_product / code_product
1          /     1              / iphone
2          /     1              / iBook
3          /     1              / macbook

Tyds
id_tyd  / user_tyd / product_tyd
1       /   1      /   1        -- mean that the id_user = 1 made a line for the iphone 
                                   sold by the company 1
2       /   1      /   2        -- same : user 1 for the ibook of company 1

これが私のリクエストです:

SELECT 
products.id_product,
users.id_user,
COALESCE(id_tyd, 'NONE') AS id_tyd 
FROM tyds
INNER JOIN users
ON tyds.user_tyd = users.id_user
INNER JOIN products
ON tyds.product_tyd = products.id_product
INNER JOIN companies
ON products.id_company_product = companies.id_company 
WHERE users.key_user = '123FDADA21312QD'
AND companies.module_key_company = '3123123123'
AND products.cancelled_product >= 0
AND products.code_product = 'iphone'

それは戻ります

products.id_product = 1
users.id_user = 1 
tyds.id_tyd = 1

完全。しかし、私がやりたいのは、tydsにこのユーザーのレコードがない場合でも、users.id_userを取得することです。好き :

SELECT 
products.id_product,
users.id_user,
COALESCE(id_tyd, 'NONE') AS id_tyd 
FROM tyds
INNER JOIN users
ON tyds.user_tyd = users.id_user
INNER JOIN products
ON tyds.product_tyd = products.id_product
INNER JOIN companies
ON products.id_company_product = companies.id_company 
WHERE users.key_user = '123FDADA21312QD'
AND companies.module_key_company = '3123123123'
AND products.cancelled_product >= 0
AND products.code_product = 'macbook'

入手したい:

  • products.id_product = 3
  • users.id_user = 1
  • tyds.id_tyd = NONE

このステップでは、私が尋ねる製品が存在し、user_keyが存在することを確信しているからです。しかし、tydsに一致するレコードがあるかどうかはわかりません。それが、私がテストしたいことです。

もちろん、すべてのテーブルは単純化されており、より多くのデータが必要になりますが、これで問題が解決すると思います。

私の最初の動きは、WHERE条件をJOINマッチに入れることでしたが、なぜ、products.code_productを製品ジョイントに入れると、異なるid_productに対してもtydsレコードが得られるのかわかりません...

あなたの助けをどうもありがとう!

4

1 に答える 1

3

その場合は、結合をからINNER JOINに変更してLEFT JOINください。INNER JOINは、基本的に、結合されているすべてのテーブルに存在する(少なくとも1つの一致)行を返しますが、他のテーブルのレコードと一致しなくても左側LEFT JOINの行を返します。

クエリ、

SELECT c.*, d.id_tyd
FROM
    (
      SELECT  a.id_user, b.id_product
      FROM    users a CROSS JOIN products b
    ) c
    LEFT JOIN tyds d
      ON d.user_tyd = c.id_user AND
         d.product_tyd = c.id_product
    LEFT JOIN products e
      ON e.id_product = c.id_product
    LEFT JOIN companies f
      ON e.id_company_product = f.id_company
    LEFT JOIN users g
      ON c.id_user = g.id_user
WHERE e.code_product = 'macbook' AND
      f.key_company = '3123123123' AND
      g.key_user = '123FDADA21312QD'
于 2012-11-21T08:21:42.687 に答える