MySQL JOIN 获取不存在的行

标签 mysql

我有 2 个表:

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 类型,整个 immobile 行未显示(返回 0 行)。

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

最佳答案

您的查询的问题是您在 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 子句,因为您的选择实际上并未使用任何聚合。根据您的数据,上述查询是有道理的。也许您打算使用 GROUP_CONCAT,但我们需要查看一些数据来确认这一点。

关于MySQL JOIN 获取不存在的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50559415/

相关文章:

MySQL 事件不会执行

mysql - 转换日期时间以获取mysql中的月份名称

mysql - 按字母顺序对 MySQL 结果排序,但数字排在最后

mysql - 准备语句语法错误

php - 警告 :mysql_connect()[function. mysql-connect]:[2002]

android - 使用 json 保护 http 请求 (android)

php - 将 AngularJs 连接到本地服务器 php MySQL

mysql - mysql中选定表的分组大小

mysql - 重组表结构或可以通过一个查询来重组

android - 使用默认值插入sqlite