我有两个具有一对多关系的表。地方和促销。一个地方可以有多个促销,这些促销适用于一周中的每一天。
简化(省略了大部分列),这些是表格:
地点
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
我想构建一个查询,获取所有地点结果,如果可用,获取相应的促销。这是我到目前为止的查询:
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 为 NULL(当该地点没有促销时)时,它工作得很好;但是当这个地方确实有促销但没有一个匹配 dia 时,问题就来了...在这种情况下,我仍然希望在促销列上获得空值的记录。
最佳答案
如果你想在 dia != form "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
关于php - MySQL 条件左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40821966/