2016-11-26 3 views
1

Ich habe zwei Tabellen mit einer eins zu viele Beziehung. Ort und Promo. Ein Ort kann mehrere Promos haben, die am Tag der Woche gelten.MySQL Bedingte LINKE JOIN

Vereinfachen (die meisten Spalten sind weggelassen), das sind die Tabellen:

Platz

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

Promo

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 

Ich möchte eine Abfrage erstellen, die mir Ergebnisse alle Platz bekommt und, falls verfügbar, erhält ich die entsprechende Promo. Dies ist die Abfrage Ich habe bisher:

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; 

Es funktioniert gut, wenn dia die Abfrage (in diesem Fall „Sabado“) übereinstimmt oder wenn dia NULL ist (für, wenn der Ort hat keine Promos); aber das Problem kommt, wenn der Ort Promos hat, aber keiner von ihnen passt dia ... in diesem Fall möchte ich immer noch den Rekord mit Null-Werte auf den Promo-Spalten.

+0

Sie brauche eine Menge aller Dias, die du für einen äußeren Join verwenden kannst. – JimmyB

Antwort

1

Wenn Sie die Antwort wollen auch, wenn das dia! = Form "Sabado" dann können Sie ein 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; 

dies mit max (dia) für dupliziert entfernen Reihe

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

Danke. Es gab mir doppelte Ergebnisse, also änderte ich dies ein wenig: SELECT idnum, nombre, MAX (dia) als dia, descripcion FROM ( SELECT d.idnum, d.nombre, Fall, wenn a.dia = "Domingo" dann a .dia sonst NULL END als dia, a.descripcion VON directorio als d LINKS JOIN avisos als ON d.idnum = a.idcliente WHERE palabras WIE "% Marinera%" LIMIT 15 OFFSET 0) AS t WHERE t. dia = "Domingo" ODER t.dia IS NULL – Multitut

+0

@Multitut. gut scheint, dass die Verwendung von Fall, wie ich vorgeschlagen habe, ist nützlich .. thel kann ich denken, dass meine Antwort Sie zum richtigen Ergebnis führen? ..if ist also bitte meine Antwort als akzeptiert markieren. – scaisEdge

+0

Sicher ändern Sie es bitte bitte. – Multitut