mysql join获取不存在的行

gopyfrb3  于 2021-06-23  发布在  Mysql
关注(0)|答案(2)|浏览(285)

我有两张table:
immagini(意大利语意为“图像”):

| id_img | id_immobile | id_utente | img_url |    type | visible_website | visible_pdf | pdf_img_type | category |
|--------|-------------|-----------|---------|---------|-----------------|-------------|--------------|----------|
|      3 |           1 |         0 |   1.jpg | general |               1 |           1 |         foto |     foto |

immobili(意大利语“不动产”):

| id_immobile | type | id_utente |
|-------------|------|-----------|
|           1 | demo |        90 |

(这不是满桌的,但我们不需要全部的)
在我的应用模型中,我需要列出所有 immobili 行基于某些条件。
我想解决的问题是,我需要一份 immobili 我加入了基于“id\u immobile”字段键的图像。
我需要的照片 immagini 只有table上有 type 的价值 main . 如果没有 main 那我还需要 immobili 排着队出现,但是 img_url 你应该回来 NULL .
所以我现在的问题是:

SELECT
immobili.id_immobile,
CONCAT(SUBSTRING_INDEX(immagini.img_url, ".", 1), "_thumb.", SUBSTRING_INDEX(immagini.img_url, ".", -1)) as img
FROM immobili    
LEFT JOIN immagini
on immagini.id_immobile = immobili.id_immobile    
WHERE (immagini.type = "main" OR immagini.type = "general" OR immagini.type IS NULL)
GROUP BY immobili.id_immobile
ORDER BY immobili.data_inserimento DESC, immobili.data_aggiornamento DESC

通过这个查询,我得到了上面所有的工作,但如果 immagini 表为空或没有 main 类型,整体 immobile 未显示行(返回0行)。
我想要的结果是显示所有 immobili 行和显示
NULL img_url 如果没有匹配的行。

aoyhnmkz

aoyhnmkz1#

删除where子句并移入条件 on 子句,以便只有行从 immagini 满足你的条件,如果你有任何过滤器 immobili 然后使用where子句

SELECT
immobili.id_immobile,
CONCAT(SUBSTRING_INDEX(immagini.img_url, ".", 1), "_thumb.", SUBSTRING_INDEX(immagini.img_url, ".", -1)) as img
FROM immobili    
LEFT JOIN immagini
ON immagini.id_immobile = immobili.id_immobile    
AND immagini.type = "main"
GROUP BY immobili.id_immobile
ORDER BY immobili.data_inserimento DESC, immobili.data_aggiornamento DESC
3mpgtkmj

3mpgtkmj2#

查询的问题是您在 WHERE 条款。它完全过滤掉了记录。通常的解决方法是移动 WHERE 逻辑进入 ON 条款:

SELECT
    i.id_immobile,
    CONCAT(SUBSTRING_INDEX(im.img_url, '.', 1), '_thumb.',
        SUBSTRING_INDEX(im.img_url, '.', -1)) AS img
FROM immobili i  
LEFT JOIN immagini im
    ON i.id_immobile = im.id_immobile AND im.type IN ('main', 'general')
ORDER BY
    i.data_inserimento DESC,
    i.data_aggiornamento DESC;

注意,我删除了 GROUP BY 子句,因为您的select实际上不使用任何聚合。根据您的数据,上述查询是有意义的。也许你打算用 GROUP_CONCAT ,但我们需要一些数据来证实这一点。

相关问题