我正在尝试加入两张桌子,但我遇到了一些麻烦。
这是主表packs
media
用于存储packs
的图像。每个包可以有0个或更多图像。当包装有图像时,其中一个将is_default
字段设置为1
以指示要显示的主图像。
我想获得所有包装和每张图片。如果没有图片,则只需一个简单的NULL
,否则会获得is_default
的图片。
这是我的查询。
SELECT
pack.*,
( SELECT media.src FROM packs pack LEFT JOIN packs_media media ON pack.id = media.pack_id WHERE media.is_default = 1 GROUP BY media.id LIMIT 1 ) AS image
FROM packs pack
LEFT JOIN packs_media ON media.pack_id = pack.id
GROUP BY pack.id
ORDER BY pack.id DESC
我总共有三个包,其中只有一个包含一些图像。
查询返回3个结果。问题是所有三个结果都有相同的image
,只有一个应该,而另外两个应该image
字段为空/空。
有没有办法只使用一个查询执行此操作?我想避免在循环中查询media
表。
谢谢
答案 0 :(得分:1)
您需要相关的子查询而不是连接:
SELECT p.*,
(SELECT m.src
FROM packs_media m
WHERE p.id = media.p
ORDER BY m.is_default DESC, m.id
LIMIT 1
) AS image
FROM packs p
ORDER BY p.id DESC;
实际上,根据问题的描述,外部查询中也不需要JOIN
。因此,也不需要GROUP BY
。
请注意ORDER BY
子句的更改。这可以保证首先选择默认值。
并且,您的查询为所有行获取相同的值,因为子查询独立于外部查询。因此,始终选择相同的值。