MySQL JOIN获取非现有行

时间:2018-05-28 05:04:54

标签: mysql

我有两张桌子:

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_immobile”字段键将其加入图像。

immagini表中我需要的图片只是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类型,则不会显示WHOLE immobile行(返回0行)。

我想要的结果是反正显示所有immobili行,如果没有匹配的行,则显示NULL img_url

2 个答案:

答案 0 :(得分:3)

您的查询问题是您在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,但我们需要查看一些数据来确认这一点。

答案 1 :(得分:1)

删除where子句并在on子句中移动条件,以便只有符合条件的immagini加入行,如果有immobili的任何过滤器,则使用where子句< / p>

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