2016-11-26 108 views
1

我有兩個一對多關係的表。地方和促銷。一個地方可以有幾個宣傳片,這些宣傳片在一週中的某一天適用。MySQL有條件的左連接

簡化(大部分列省略),這些都是表:

廣場

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 

我想建立一個查詢,讓我所有的地方結果,並且如果可用,則獲取相應的促銷。這是查詢我到目前爲止:

​​

它工作得很好,當直徑匹配查詢(在這種情況下,「Sabado」),或當直徑爲NULL(對於當這個地方沒有電視節目預告);但問題出現時,該地方確實有促銷活動,但沒有一個匹配dia ...在這種情況下,我仍然會在促銷列上獲得空值的記錄。

+0

你需要一系列可用於外連接的所有dias。 – JimmyB

回答

1

如果你想響應也當直徑!=形式 「Sabado」,那麼你可以使用CASE WHEN

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; 

這種與MAX(DIA)的刪除重複的行

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,MAX(dia)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 d.idnum = a.idcliente WHERE palabras LIKE「%Marinera%」LIMIT 15 OFFSET 0)AS t WHERE t。 dia =「Domingo」 OR t.dia IS NULL – Multitut

+0

@Multitut。好像我提出的案例的使用是有用的.. thel我可以認爲我的答案引導你到正確的結果?如果我的回答標記爲已接受, – scaisEdge

+0

當然,請相應地修改它。 – Multitut