2016-11-26 22 views
1

1対多の関係を持つ2つのテーブルがあります。場所とプロモーション。場所には、曜日によって適用されるいくつかのプロモーションがあります。MySQL条件付きLEFT JOIN

は(ほとんどの列が省略されている)の簡素化、これらはテーブルです:

場所

idnum nombre 
-- 
42  SUBWAY 
55376 ANTOJERIA MAKECH 
50112 TORTAS BERNAL LAS ORIGINALES DESDE 1960 
55185 LA MARINERA 

プロモ

idnum titulo     dia  idcliente 
135  Pescado Frito 2 x 1  Lunes 55185 
136  Pescado Frito 2 x 1  Martes 55185 
137  Margaritas 2 x 1  Jueves 55185 
138  Tacos 3 x 2    Viernes 55185 
139  5 cervezas    Sabado 55185 

私は私のすべての場所の結果を取得するクエリを構築したいです可能であれば、私に対応するプロモーションを取得します。これは私がこれまで持っているクエリです:

​​

DIAがまたはDIAが(場所は何のプロモーションを持っていないときのために)NULLの場合(この場合は「Sabado」で)クエリに一致したときにそれがうまく動作します。 問題は、場所がプロモーションを持っているが、それらのどれもdiaと一致していないときに発生します...その場合、私はまだプロモーション列にヌル値でレコードを取得したいと思います。

+0

CASEを使用することができたときには、応答をしたい場合外部結合に使用できるすべてのdiasのセットが必要です。 – JimmyB

答えて

1

除去のための最大(DIA)と

SELECT * 
    FROM (
     SELECT d.nombre, case when a.dia = "Sabado" then a.dia else NULL END, a.descripcion 
     FROM directorio as d 
     LEFT JOIN avisos as a ON d.idnum = a.idcliente 
     WHERE palabras LIKE "%Marinera%" LIMIT 15 OFFSET 0) AS t 
    WHERE t.dia = "Sabado" 
    OR t.dia IS NULL; 

これは重複WHEN DIA!=フォーム "Sabado" は、あなたがあなたが行

SELECT 
     idnum 
     , nombre 
     , MAX(dia) as dia 
     , descripcion 
    FROM ( 
     SELECT 
       d.idnum 
      , d.nombre 
      , case when a.dia = "Domingo" then a.dia else NULL END as dia 
      , a.descripcion FROM directorio as d 
     LEFT JOIN avisos as a ON d.idnum = a.idcliente 
     WHERE palabras LIKE "%Marinera%" 
     LIMIT 15 OFFSET 0) AS t 
    WHERE t.dia = "Domingo" OR t.dia IS NULL 
+0

ありがとうございます。それは私に重複した結果をもたらしたので、これを少し変更しました: SELECT idnum、nombre、dia(desc)としてのMAX(dia) FROM( SELECT d.idnum、d.nombre、a.dia = "Domingo" .dia else NULL end of dia、a.descripcion ディレクターとしてd LEFT JOIN avisos on a d.idnum = a.idcliente どこでもpalabras LIKE "%Marinera%" LIMIT 15 OFFSET 0)AS t どこにいますか。 dia = "Domingo" OR t.dia IS NULL – Multitut

+0

@Multitut。よく私が示唆したようにケースの使用が有用であるように思えます..私は私の答えが正しい結果につながると思いますか?私の答えは受け入れられたとマークしてください。 – scaisEdge

+0

もちろんそれに合わせて修正してください。 – Multitut