2017-10-04 13 views
0

アイブ氏は現在、以下のような問題があります。SQLは、選択最初のテーブルを結合する左一度

私はMySQLのクエリを持っている:

SELECT account.id as id, `cname`, `username`, `state`, `dow` 
FROM account 
LEFT JOIN zeitplanung 
ON account.id = zeitplanung.user_id 
WHERE account.hide = 0 
and ifnull(zeitplanung.kw,43) = 43 
and ifnull(zeitplanung.year, 2017) = 2017; 

それは私が「の場合には、ユーザ名を返し、それらの値を言及します右の年とkwを選択し、結合テーブルにエントリがない場合はテーブルアカウントから値を返し、その他の値はすべてNULLと返します。

しかし、カフェテリア(kw、年)に適合しないテーブル "zeitplanung"にエントリがある場合は、ユーザーネームを返しません。 「一致するエントリがWHERE文が勝った場合にはNULLとしてユーザ名と第二のテーブルのエントリを取得

  • が存在する場合、第2のテーブルからすべてのエントリを取得

    • はどのように私はそのクエリを記述する必要がありませんフィット。

  • +0

    が、私の知る限り、このようなデフォルトのquerysはbouth –

    +0

    サンプルデータ上で実行する必要がありますし、期待される:それらを保つために、彼らのON句にOUTERのテーブルの任意のフィルタリング条件を移動結果は意味のある回答に役立ちます。 –

    +0

    http://i.epvpimg.com/6Qnfbab.pngこれはテーブルの画面です。 例えばkw = 40の場合、上位クエリでは、 http://i.epvpimg.com/0BmQdab.png、kw = 41の場合はbouth id | s、ユーザー名、cnames以外は同じですが、残りのデータをNULLとして返します。 –

    答えて

    1

    問題は、あなたのWHERE句でNULL結果をフィルタリングしていることです。私は、デフォルトのMySQLサーバを使用してい

    SELECT account.id as id, `cname`, `username`, `state`, `dow` 
    FROM account 
    LEFT JOIN zeitplanung 
    ON account.id = zeitplanung.user_id 
    AND zeitplanung.kw = 43 
    AND zeitplanung.year = 2017 
    WHERE account.hide = 0; 
    
    +0

    'NULL'をフィルタリングしないと、それは'内部結合 'を暗示しませんか? –

    +0

    @WEI_DBAいいえ、あなたの条件を 'ON'節に移動すると、' LEFT JOIN'は条件が一致しなかった場合に 'NULL'を返します。 'WHERE'節の条件では、' LEFT JOIN'は 'NULL'を返しますが、' WHERE'節はそれらをフィルタリングします( 'JOIN'の後に' WHERE'が実行されます)。 – Siyual

    +1

    非常にありがとう、私の最初のクエリに似ています:Dは異なるを確認する必要があります ああ別のことは、この作品が知っているhavntに参加を置くことです:)多くのありがとう –

    関連する問題