我有 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
,但我们需要查看一些数据来确认这一点。
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