代码之家  ›  专栏  ›  技术社区  ›  Mr.Web

MySQL连接获取不存在的行

  •  1
  • Mr.Web  · 技术社区  · 6 年前

    我有两张桌子:

    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 行基于某些条件。

    我想解决的问题是,我需要列出所有 固定 我确实加入了基于“id_immobile”字段键的图像。

    我需要的照片来自 immagini 桌子是唯一一个有 type 价值 main .如果没有 主要的 那我还需要 固定 排着队出现,但是 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
    

    通过这个查询,我可以处理以上所有问题,但是如果 伊马吉尼 表是空的或没有 主要的 类型,全部 immobile 未显示行(返回0行)。

    我想要的结果是展示所有 固定 不管怎样,排成一行,显示一个 无效的 img_网址 如果没有匹配的行。

    2 回复  |  直到 6 年前
        1
  •  3
  •   Tim Biegeleisen    6 年前

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

        2
  •  2
  •   Mr.Web    6 年前

    删除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