2016-11-26 106 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