Php MySQL条件左连接

Php MySQL条件左连接,php,mysql,Php,Mysql,我有两张一对多关系的桌子。地点和宣传。一个地方可以有几个促销活动,在一周中的某一天进行 为了简化,省略了大多数列,如下表: 放置 宣传片 我想建立一个查询,让我得到所有的地方结果,如果可用,让我相应的促销。这是我到目前为止提出的问题: SELECT * FROM (SELECT d.nombre, a.dia, a.descripcion FROM directorio as d LEFT JOIN avisos as a ON d.idnum = a.idcliente WHERE palab

我有两张一对多关系的桌子。地点和宣传。一个地方可以有几个促销活动,在一周中的某一天进行

为了简化,省略了大多数列,如下表:

放置

宣传片

我想建立一个查询,让我得到所有的地方结果,如果可用,让我相应的促销。这是我到目前为止提出的问题:

SELECT * FROM (SELECT d.nombre, a.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 = "Sabado" OR t.dia IS NULL;

当dia与本例中的查询Sabado匹配时,或者当dia为空时,当该位置没有促销时,它工作得很好;但问题是,当这个地方确实有促销活动,但没有一个与dia相匹配。。。在这种情况下,我仍然希望在promo列上获得具有空值的记录。

如果您希望在dia!=从Sabado开始,您可以在

  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;
使用maxdia删除重复的行

  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

您需要一套可用于外部连接的所有DIA。谢谢。它给了我重复的结果,所以我改变了一点:选择idnum,nombre,MAXdia作为dia,从SELECT d.idnum,d.nombre,case当a.dia=Domingo,然后a.dia else NULL END作为dia,a.将董事会的意见描述为d左,在d.idnum=a.idcliente上加入avisos,其中palabras如%Marinera%LIMIT 15偏移0为t,其中t.dia=Domingo或t.dia为NULL@Multitut . 我建议的case用法似乎很有用。。我能认为我的回答能引导你得出正确的结果吗。。如果是这样,请将我的答案也标记为已接受。当然,请相应地修改它。
  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;
  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